Session 是服務端的會話管理機制,本質是一個以 Session ID 為鍵的散列表。本文系統梳理創建、獲取、持久化、銷毀全生命周期。
request.getSession(true) 創建 Session,生成唯一 JSESSIONIDSet-Cookie: JSESSIONID=xxx; Path=/ 將 ID 發送給瀏覽器「關閉瀏覽器 Session 就消失了」是錯誤的。 Session 存儲在服務端,瀏覽器關閉僅銷毀內存 Cookie(JSESSIONID),導致無法關聯原 Session。若將 Cookie 持久化到硬盤或使用 URL 重寫傳遞 ID,重新打開瀏覽器仍可恢復會話。
<%@ page session="true" %>
<%
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(20); // 20 秒內關閉瀏覽器仍保留 ID
response.addCookie(cookie);
%>
服務端在響應頁面所有鏈接、表單 Action 後追加 ;jsessionid=XXX:
<form action="<%= response.encodeURL("hello.jsp") %>" method="post">...</form>
<a href="<%= response.encodeURL("login.jsp") %>">重新登錄</a>
下次請求攜帶 ID,服務端自動解析恢復 Session。
<session-config>
<session-timeout>30</session-timeout> <!-- 30 分鐘 -->
</session-config>
session.setMaxInactiveInterval(1800); // 30 分鐘
int maxSec = session.getMaxInactiveInterval();
| 階段 | 觸發條件 | 備註 |
|---|---|---|
| 創建 | 首次調用 getSession(true) 或 JSP 隱式創建 | 可在 page 指令 session="false" 禁用隱式創建 |
| 訪問 | 攜帶有效 JSESSIONID 請求 | 每次訪問重置空閒計時器 |
| 銷毀 | 1. 調用 invalidate()2. 超過 maxInactiveInterval3. Web 應用卸載 | 關閉瀏覽器不銷毀 Session |
invalidate() 登出<%@ page session="false" %>