以前在學習的時候沒怎麼注意,今天又回過頭來仔細研究研究了一下Session的生命週期。
Session儲存在伺服器端,一般為了防止在伺服器的記憶體中(為了高速存取),Sessinon在使用者存取第一次存取伺服器時創建,需要注意只有存取JSP、Servlet等程式時才會建立Session,只存取HTML、IMAGE等靜態資源並不會建立Session,可呼叫request.getSession(true)強制產生Session。
Session何時失效?
1. 伺服器會把長時間沒有活動的Session從伺服器記憶體中清除,此時Session便失效。 Tomcat中Session的預設失效時間為20分鐘。
2. 呼叫Session的invalidate方法。
Session對瀏覽器的要求:
################################################################### ## ### ######雖然Session保存在伺服器,對客戶端是透明的,它的正常運作仍然需要客戶端瀏覽器的支援。這是因為Session需要使用Cookie作為識別標誌。 HTTP協定是無狀態的,Session不能依據HTTP連線來判斷是否為同一客戶,因此伺服器向客戶端瀏覽器發送一個名為JSESSIONID的Cookie,它的值為該Session的id(也就是HttpSession.getId()的返回值)。 Session依據該Cookie來辨識是否為同一使用者。 ###### 此Cookie為伺服器自動產生的,它的maxAge屬性一般為-1,表示僅當前瀏覽器內有效,且各瀏覽器視窗間不共享,關閉瀏覽器就會失效。因此同一機器的兩個瀏覽器視窗存取伺服器時,會產生兩個不同的Session。但是由瀏覽器視窗內的連結、腳本等開啟的新視窗(也就是說不是雙擊桌面瀏覽器圖示等開啟的視窗)除外。這類子視窗會共用父視窗的Cookie,因此會共用一個Session。 ###
注意:新開的瀏覽器視窗會產生新的Session,但子視窗除外。子視窗會共用父視窗的Session。例如,在連結上按右鍵,在彈出的快速選單中選擇"在新視窗中開啟"時,子視窗便可存取父視窗的Session。
如果客戶端瀏覽器將Cookie功能停用,或不支援Cookie怎麼辦?例如,絕大多數的手機瀏覽器都不支援Cookie。 Java Web提供了另一個解決方案:URL位址重寫。
URL位址重寫是對客戶端不支援Cookie的解決方案。 URL位址重寫的原理是將該使用者Session的id資訊重寫到URL位址中。伺服器能夠解析重寫後的URL取得Session的id。這樣即使客戶端不支援Cookie,也可以使用Session來記錄使用者狀態。 HttpServletResponse類別提供了encodeURL(String url)實作URL位址重寫,該方法會自動判斷客戶端是否支援Cookie。如果客戶端支援Cookie,會將URL原封不動地輸出來。如果客戶端不支援Cookie,則會將使用者Session的id重寫到URL中。
注意:TOMCAT判斷客戶端瀏覽器是否支援Cookie的依據是請求中是否含有Cookie。雖然客戶端可能會支援Cookie,但是由於第一次要求時不會攜帶任何Cookie(因為沒有任何Cookie可以攜帶),URL位址重寫後的位址中仍然會帶有jsessionid。當第二次訪問時伺服器已經在瀏覽器中寫入Cookie了,因此URL位址重寫後的位址中就不會帶有jsessionid了。
#以上是Session的生命週期的詳細內容。更多資訊請關注PHP中文網其他相關文章!