首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Tomcat Session 超時配置全攻略:三種設定方式與永不過期實作

     編輯:Java 相關知識

Session 超時機制速覽

Session 超時指「用戶連續無操作」達到設定分鐘數後,容器自動銷毀 Session 並釋放記憶體。預設值通常為 30 分鐘(web.xml 標準規範)。

三種配置層級與優先順序

層級配置位置作用範圍優先順序單位
1. 全域預設$CATALINA_HOME/conf/web.xml該 Tomcat 實例所有 Webapp最低分鐘
2. 應用級覆蓋WEB-INF/web.xml單一 Webapp中分鐘
3. 程式動態控制Servlet/Filter/Listener 代碼單一 Session 實例最高秒

具體配置範例

1. 全域預設 conf/web.xml

<session-config>
  <session-timeout>60</session-timeout>  <!-- 60 分鐘 -->
</session-config>

2. 應用級 WEB-INF/web.xml

<session-config>
  <session-timeout>15</session-timeout>  <!-- 15 分鐘 -->
</session-config>

注意: 設為 0 或負數代表永不過期(Servlet 3.0+ 支援),但不建議全域啟用,易造成記憶體洩漏。

3. 程式碼動態設定(單位:秒)

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 分鐘
}

進階場景:集群環境 Session 複寫與持久化

  • Sticky Session (LB 層):Nginx ip_hash / Cookie 親和性,簡單但單點風險高
  • Tomcat DeltaManager / BackupManager:server.xml 配置 <Cluster>,記憶體內複寫,適合小叢集
  • Redis / Memcached 外部存儲:spring-session-data-redis、memcached-session-manager,生產環境首選,支援跨語言、重啟不丟失
  • 資料庫持久化:JDBC Store,效能較差,僅作備援

常見坑點與排查

  1. session-timeout 設 0 但仍失效:檢查瀏覽器關閉導致 Session Cookie 丟失(JSESSIONID),非 Server 端超時
  2. 動態 setMaxInactiveInterval 不生效:確認在 request.getSession() 之後、回應提交前呼叫
  3. 記憶體暴增:永不過期 + 大量用戶 = OOM 風險,必須配合定時掃描清理非活躍 Session
  4. 跨子域共享 Session:設定 sessionCookieDomain=.example.com (Context 配置) + 同一 Session Store

安全性建議

  • session-config 加入 <tracking-mode>COOKIE</tracking-mode> 禁用 URL Rewriting 防 Session Fixation
  • HTTPS 環境強制 secure=true; HttpOnly=true; SameSite=Strict/Lax (Servlet 5.0+ / Tomcat 9.0.21+ 原生支援)
  • 定期輪換 Session ID:登入成功後 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 解決擴展性與高可用需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved