Session 超時是指用戶在指定時間內無任何請求,服務器自動銷毀 Session 對象,釋放內存。超時時間以「最後訪問時間」為基準計算,非創建時間。默認超時通常為 30 分鐘 (容器默認)。
<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>
@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();
}
}
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
@Configuration
public class SessionConfig implements WebMvcConfigurer {
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addContextCustomizers(context -> context.setSessionTimeout(30, TimeUnit.MINUTES));
return factory;
}
}
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
public class HttpSessionConfig {
// 自動配置 RedisSessionRepository
// 支持多實例 Session 共享、WebSocket Session、Reactive Session
}
| 維度 | web.xml | setMaxInactiveInterval | Spring Boot 配置 |
|---|---|---|---|
| 生效範圍 | 全局所有 Session | 單個 Session | 全局 (可被代碼覆蓋) |
| 動態性 | 重啟生效 | 即時生效 | 熱加載 (DevTools) / 重啟 |
| 單位 | 分鐘 | 秒 | Duration 格式 (30m/1800s) |
| 分布式支持 | 需容器集群 | 需手動同步 | Spring Session + Redis |
| 推薦場景 | 傳統單體、統一策略 | 差異化業務邏輯 | 現代 Spring Boot 應用 |
application.yml 設置合理默認值 (如 30m)setMaxInactiveInterval()/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,下次請求需重新登錄,但未必觸發登出業務邏輯 |
通過 SessionRepositoryFilter 攔截請求,用 SessionRepository (Redis/JDBC/Mongo/Hazelcast) 替換容器原生 Session 存儲。關鍵點:
SESSION),支持 Header/URL 參數maxInactiveIntervalInSeconds 統一控制 TTL,Redis Key 自動過期@EnableRedisHttpSession、@EnableJdbcHttpSession 等註解一鍵啟用@EnableRedisWebSession