Session 是 Web 應用中維持用戶會話狀態的核心機制。本文詳細解析 Session 的作用域、生命週期、創建與銷毀條件、鈍化/活化機制,並提供 Java 與 PHP 兩種語言的對比代碼。
| 屬性 | 說明 |
|---|---|
| 作用域 | 當前會話範圍(瀏覽器關閉或超時失效) |
| 生命週期 | 首次調用 request.getSession() 創建 → 30 分鐘無操作超時(可在 web.xml 配置) → 銷毀 |
| 銷毀觸發 | 1) session.invalidate() 主動銷毀 2) 超時自動銷毀 3) 伺服器非正常關閉 |
// 1. 獲取 Session(若不存在則創建)
HttpSession session = request.getSession(); // 等同 getSession(true)
HttpSession session = request.getSession(false); // 不創建,無則返回 null
// 2. 存儲屬性
session.setAttribute("name", "taoshihan"); // key: String, value: Object
// 3. 讀取屬性
Object name = session.getAttribute("name"); // 需強制轉型
// 4. 移除屬性
session.removeAttribute("name");
// 5. 獲取 Session ID
String jsessionid = session.getId();
當伺服器正常關閉時,未超時的 Session 會序列化到磁碟(Tomcat 預設 work/Catalina/localhost/),此過程稱為鈍化;伺服器重啟時反序列化恢復到內存,稱為活化。
前提:存入 Session 的對象必須實現java.io.Serializable介面,否則鈍化失敗拋出NotSerializableException。
| 操作 | Java (Servlet) | PHP |
|---|---|---|
| 啟動/獲取 | HttpSession session = request.getSession(); | session_start(); |
| 寫入 | session.setAttribute("name", "value"); | $_SESSION['name'] = "value"; |
| 讀取 | session.getAttribute("name"); | $_SESSION['name']; |
| 銷毀 | session.invalidate(); | session_destroy(); |
<web-app>
<session-config>
<session-timeout>30</session-timeout> <!-- 單位:分鐘 -->
</session-config>
</web-app>
getSession() 會觸發創建,若僅檢查是否存在請用 getSession(false)。response.encodeURL())。