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

Java Web Session 逾時設定完整指南:web.xml、註解與程式碼三種方式

     編輯:Java 相關知識

Session 逾時機制

Session 逾時指使用者在指定時間內無任何請求,伺服器銷毀 Session 釋放記憶體。預設值通常為 30 分鐘 (Tomcat)。設定單位:web.xml 以分鐘為單位,程式碼以秒為單位。

三種設定方式優先序

方式範圍單位優先序備註
web.xml <session-config>全域 (整個 Web App)分鐘最低部署描述檔,無需重新編譯
@WebServlet/@WebListener 註解單一 Servlet/Listener秒中Servlet 3.0+,編譯期決定
HttpSession.setMaxInactiveInterval()單一 Session 實例秒最高執行期動態調整,-1 代表永不過期

原則:程式碼 > 註解 > web.xml,局部 > 全域

方式一:web.xml 全域設定 (傳統、通用)

<web-app xmlns="https://xmlns.jcp.org/xml/ns/javaee"
         version="4.0">
    <session-config>
        <session-timeout>30</session-timeout> <!-- 30 分鐘 -->
    </session-config>
</web-app>
  • 值為 0 或負數:Session 永不過期 (不建議生產環境)。
  • 修改後需重新部署或重啟容器生效。

方式二:Servlet 註解設定 (Servlet 3.0+)

@WebServlet(urlPatterns = "/login", 
            initParams = @WebInitParam(name = "sessionTimeout", value = "1800")) // 1800 秒 = 30 分鐘
public class LoginServlet extends HttpServlet {
    // 實際仍需在程式碼中讀取 initParam 並呼叫 setMaxInactiveInterval
}

註解本身不直接生效,需搭配程式碼:

@Override
public void init(ServletConfig config) {
    String timeoutStr = config.getInitParameter("sessionTimeout");
    if (timeoutStr != null) {
        try {
            this.defaultTimeout = Integer.parseInt(timeoutStr);
        } catch (NumberFormatException ignored) {}
    }
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
    HttpSession session = req.getSession(true);
    session.setMaxInactiveInterval(this.defaultTimeout); // 套用
}

方式三:程式碼動態設定 (最靈活、最高優先權)

// 登入成功後,依使用者角色給予不同逾時
HttpSession session = request.getSession(true);
if ("admin".equals(user.getRole())) {
    session.setMaxInactiveInterval(60 * 60); // 管理員 1 小時
} else if ("vip".equals(user.getRole())) {
    session.setMaxInactiveInterval(45 * 60); // VIP 45 分鐘
} else {
    session.setMaxInactiveInterval(30 * 60); // 一般 30 分鐘
}
// 永不過期 (慎用):session.setMaxInactiveInterval(-1);

Spring Boot 專案統一配置

# application.yml
server:
  servlet:
    session:
      timeout: 30m  # 支援單位:s, m, h, d
      # tracking-modes: cookie # 僅用 Cookie 追蹤 Session

或程式化配置:

@Configuration
public class SessionConfig {
    @Bean
    public TomcatServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.addContextCustomizers(context -> context.setSessionTimeout(30)); // 分鐘
        return factory;
    }
}

常見問題與最佳實踐

  • 單位陷阱:web.xml 分鐘 vs 程式碼秒,切記換算 (×60)。
  • 逾時 vs 瀏覽器關閉:關閉瀏覽器不會立即銷毀 Server 端 Session,僅刪除 Session Cookie (JSESSIONID),下次開啟瀏覽器無法關聯舊 Session。
  • Cluster 環境:需配置 Session Replication 或 Redis 共享存儲,逾時設定需在所有節點一致。
  • 安全考量:敏感系統建議縮短逾時 (15-30 分鐘),並實作「閒置偵測」前端提醒使用者延長。
  • 監控指標:監控活躍 Session 數、平均存活時間,防止記憶體洩漏。

程式化查詢與手動失效

HttpSession session = request.getSession(false); // 不建立新 Session
if (session != null) {
    int maxInactive = session.getMaxInactiveInterval(); // 取得秒數
    long lastAccessed = session.getLastAccessedTime(); // 最後存取毫秒時間戳
    long creationTime = session.getCreationTime();
    
    // 手動登出/銷毀
    session.invalidate(); 
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved