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

Java Web 設置 Session 超時的三種標準方式

     編輯:Java 相關知識

Session 超時機制原理

Session 超時是指用戶在指定時間內無任何請求,服務器自動銷毀 Session 對象,釋放內存。超時時間以「最後訪問時間」為基準計算,非創建時間。默認超時通常為 30 分鐘 (容器默認)。

方式一:web.xml 全局配置 (Servlet 標準)

<web-app xmlns="https://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://xmlns.jcp.org/xml/ns/javaee 
         https://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <session-config>
        <session-timeout>30</session-timeout> <!-- 單位:分鐘 -->
    </session-config>

</web-app>
  • 優點:標準化、無代碼侵入、集中管理
  • 缺點:需重啟應用生效、無法動態區分用戶/角色
  • 適用:統一超時策略的傳統 Web 應用

方式二:代碼動態設置 (Servlet API)

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
        HttpSession session = req.getSession(true);
        session.setAttribute("user", user);

        // 設置當前 Session 超時:30 分鐘
        session.setMaxInactiveInterval(30 * 60); // 單位:秒

        // 記住我:延長至 7 天
        if ("true".equals(req.getParameter("rememberMe"))) {
            session.setMaxInactiveInterval(7 * 24 * 60 * 60);
        }

        // 立即失效 (登出)
        // session.invalidate();
    }
}
  • 優點:運行時動態調整、可按用戶/業務差異化
  • 缺點:分散在業務代碼中、需注意單位是秒
  • 適用:差異化超時需求 (VIP 長、普通短、敏感操作短)

方式三:Spring Boot 配置屬性 (現代標準)

1. application.yml

server:
  servlet:
    session:
      timeout: 30m  # 支持單位:s/m/h/d,默認分鐘
      # 或者
      # timeout: 1800  # 秒 (Spring Boot 2.x)
      
# Redis 分布式 Session
spring:
  session:
    store-type: redis
    redis:
      namespace: spring:session
      flush-mode: on_save
    timeout: 30m  # 覆蓋 server.servlet.session.timeout

2. 程序化配置 (WebMvcConfigurer)

@Configuration
public class SessionConfig implements WebMvcConfigurer {
    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.addContextCustomizers(context -> context.setSessionTimeout(30, TimeUnit.MINUTES));
        return factory;
    }
}

3. Spring Session 異構環境共享

@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
public class HttpSessionConfig {
    // 自動配置 RedisSessionRepository
    // 支持多實例 Session 共享、WebSocket Session、Reactive Session
}

對比總結表

維度web.xmlsetMaxInactiveIntervalSpring Boot 配置
生效範圍全局所有 Session單個 Session全局 (可被代碼覆蓋)
動態性重啟生效即時生效熱加載 (DevTools) / 重啟
單位分鐘秒Duration 格式 (30m/1800s)
分布式支持需容器集群需手動同步Spring Session + Redis
推薦場景傳統單體、統一策略差異化業務邏輯現代 Spring Boot 應用

最佳實踐建議

  1. 基線配置:application.yml 設置合理默認值 (如 30m)
  2. 業務覆蓋:登錄成功時根據「記住我」、用戶等級動態調用 setMaxInactiveInterval()
  3. 安全操作縮短:支付/修改密碼等敏感頁面單獨設置短超時 (5-10 分鐘)
  4. 分布式一致性:集群環境必須用 Spring Session + Redis,避免單機 Session 丟失
  5. 監控指標:監控活躍 Session 數、平均存活時間、超時銷毀率
  6. 前端配合:心跳請求 /keep-alive 延長活躍 Session,頁面關閉前 sessionStorage 保存狀態

常見誤區

誤區真相
session-timeout 設置 0 表示永不過期0 或負數表示永不過期 (Servlet 規範),但容器可能有上限限制
setMaxInactiveInterval(0) 立即失效0 表示永不過期,立即失效用 session.invalidate()
修改 web.xml 立即生效需重新部署/重啟應用
Spring Boot timeout 單位是秒Spring Boot 2.x+ 支持 Duration 格式,推薦明確單位 30m
Session 超時 = 用戶登出超時銷毀 Session,下次請求需重新登錄,但未必觸發登出業務邏輯

Spring Session 核心原理

通過 SessionRepositoryFilter 攔截請求,用 SessionRepository (Redis/JDBC/Mongo/Hazelcast) 替換容器原生 Session 存儲。關鍵點:

  • Session ID 默認存 Cookie (SESSION),支持 Header/URL 參數
  • maxInactiveIntervalInSeconds 統一控制 TTL,Redis Key 自動過期
  • 支持 @EnableRedisHttpSession、@EnableJdbcHttpSession 等註解一鍵啟用
  • WebFlux 響應式支持 @EnableRedisWebSession
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved