現象
登錄成功存 `session["name"]`,賦值給對象能看到值,但下次使用變 `null`。
常見原因
- Session 過期:默認 30 分鐘無活動過期。檢查 `web.xml` ``。
- Session ID 丟失:客戶端禁用 Cookie 且未啟用 URL 重寫 (`response.encodeURL`)。
- 多次獲取 Session:`request.getSession(true)` 每次調用可能創建新 Session,應用 `request.getSession(false)` 獲取現有。
- 集群/負載均衡:Session 未同步 (需 Sticky Session 或 Redis 共享)。
正確用法
// 登錄時
HttpSession session = request.getSession();
session.setAttribute("name", userName); // 存對象而非字符串更佳
// 後續使用
HttpSession session = request.getSession(false); // 不創建新
if (session != null) {
String name = (String) session.getAttribute("name");
}
配置建議
- 生產環境配置 Redis/JDBC Session 持久化。
- 設置合理超時時間 (如 2 小時)。