Session 超時指「用戶連續無操作」達到設定分鐘數後,容器自動銷毀 Session 並釋放記憶體。預設值通常為 30 分鐘(web.xml 標準規範)。
| 層級 | 配置位置 | 作用範圍 | 優先順序 | 單位 |
|---|---|---|---|---|
| 1. 全域預設 | $CATALINA_HOME/conf/web.xml | 該 Tomcat 實例所有 Webapp | 最低 | 分鐘 |
| 2. 應用級覆蓋 | WEB-INF/web.xml | 單一 Webapp | 中 | 分鐘 |
| 3. 程式動態控制 | Servlet/Filter/Listener 代碼 | 單一 Session 實例 | 最高 | 秒 |
conf/web.xml<session-config>
<session-timeout>60</session-timeout> <!-- 60 分鐘 -->
</session-config>
WEB-INF/web.xml<session-config>
<session-timeout>15</session-timeout> <!-- 15 分鐘 -->
</session-config>
注意: 設為 0 或負數代表永不過期(Servlet 3.0+ 支援),但不建議全域啟用,易造成記憶體洩漏。
HttpSession session = request.getSession();
// 設定 10 分鐘 = 600 秒
session.setMaxInactiveInterval(600);
// 永不過期(慎用!需配合業務邏輯手動清理)
session.setMaxInactiveInterval(-1);
最佳實踐: 登入成功後根據「記住我」勾選動態調整:
if (rememberMe) {
session.setMaxInactiveInterval(30 * 24 * 60 * 60); // 30 天
} else {
session.setMaxInactiveInterval(30 * 60); // 30 分鐘
}
ip_hash / Cookie 親和性,簡單但單點風險高server.xml 配置 <Cluster>,記憶體內複寫,適合小叢集spring-session-data-redis、memcached-session-manager,生產環境首選,支援跨語言、重啟不丟失request.getSession() 之後、回應提交前呼叫sessionCookieDomain=.example.com (Context 配置) + 同一 Session Storesession-config 加入 <tracking-mode>COOKIE</tracking-mode> 禁用 URL Rewriting 防 Session Fixationsecure=true; HttpOnly=true; SameSite=Strict/Lax (Servlet 5.0+ / Tomcat 9.0.21+ 原生支援)session.invalidate() → request.changeSessionId()| 需求 | 推薦做法 |
|---|---|
| 全站統一 20 分鐘 | 修改 conf/web.xml |
| 特定應用 10 分鐘 | 修改應用 WEB-INF/web.xml |
| 「記住我」30 天 | 登入後 session.setMaxInactiveInterval(2592000) |
| 永不過期(後台管理) | setMaxInactiveInterval(-1) + 定時清理任務 |
| 集群高可用 | Spring Session + Redis Cluster |
Session 超時配置看似簡單,實則涉及規格優先順序、單位陷阱、集群一致性與安全性多重考量。建議採用「全域預設保守、應用級覆蓋、程式動態精準控制」三層策略,並引入外部 Session Store 解決擴展性與高可用需求。