HttpSession原理
HttpSession原理
簡介:
當嘗試執行 HttpServletRequest 的 getSession() 時,Web容器會為你建立 HttpSession 物件,
每個 HttpSession 物件都會有個特殊的 ID,稱之為Session ID,你可以執行 HttpSession 的 getId()
來取得 Session ID。這個 Session ID 預設會使用 Cookie 存放至瀏覽器,
Cookie 的名稱預設是 JSESSIONID,數值則是 getId() 取得的 Session ID。
HttpSession Roadmap:
1.HttpSession屬性是存在Server
2.Session ID 預設使用 Cookie 存放於瀏覽器
3.Web 容器儲存 Session ID 的 Cookie 預設為關閉瀏覽器就失效
4.重新開啟瀏覽器請求應用程式時,透過 getSession() 取得的就是新的 HttpSession 物件
5.HttpSession 物件會佔用記憶體空間,所以 HttpSession 的屬性中儘量不要儲存耗資源的大型物件,必要時將屬性移除
6.或者不需使用 HttpSession 時,執行 invalidate() 讓 HttpSession 失效
7.預設關閉瀏覽器會馬上失效的是瀏覽器上的 Cookie,不是伺服器上的 HttpSession 物件
8.因為 Cookie 失效了,就無法透過 Cookie 來發送 Session ID,所以嘗試 getSession() 時,容器會產生新的 HttpSession
9.讓 HttpSession 立即失效必須執行 invalidate() 方法,否則的話,HttpSession 會等到設定的失效期間過後才會被容器銷毀回收
web.xml session timeout
1 | //在 web.xml 中設定 HttpSession 預設的失效時間,(單位:分鐘) |
HttpSession.setMaxInactiveInterval:
執行 HttpSession 的 setMaxInactiveInterval() 方法,所設定的是 HttpSession 物件在瀏覽器多久沒活動就失效的時間
而不是儲存 Session ID 的 Cookie 失效時間。儲存 Session ID 的 Cookie 預設為關閉瀏覽器就失效
在 Servlet 4.0 中,HttpSession 預設失效時間,也可以透過 ServletContext 的 setSessionTimeout() 來設定。
透過 SessionCookieConfig 實作物件,你可以設定儲存 Session ID 的 Cookie 相關資訊,例如可以透過 setName() 將預設的 Session ID 名稱修改為別的名稱
透過 setMaxAge() 設定儲存 Session ID 的 Cookie 存活期限 (單位:秒)
要注意的是,設定 SessionCookieConfig 必須在 ServletContext 被初始化之前
web.xml 修改 Session ID、Cookie 存活期等資訊:
1 | </web-app …> |