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
2
3
4
5
6
7
//在 web.xml 中設定 HttpSession 預設的失效時間,(單位:分鐘)
</web-app …>
...
<session-config>
<session-timeout>30</session-timeout> <!-- 30 分鐘 -->
</session-config>
</web-app>

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
2
3
4
5
6
7
8
9
10
11
12
</web-app …>
...
<session-config>
<session-timeout>30</session-timeout> <!-- 30 分鐘 -->
<cookie-config>
<name>yourJsessionid</name>
<secure>true</secure>
<http-only>true</http-only>
<max-age>1800</max-age> <!-- 1800 秒,不建議 -->
</cookie-config>
</session-config>
</web-app>