SpringBoot会话生命周期配置问题及固定有效期实现方法
关于Spring Boot会话生命周期的问题解答
一、web.xml中session-timeout的默认行为
web.xml里配置的<session-timeout>是空闲超时时间,并非固定的会话总时长:
- 当用户有活动(比如刷新页面、发送请求)时,会话的有效期会自动重置,从当前活动时间开始重新计算20分钟的超时窗口。
- 只有当用户连续20分钟无任何操作,会话才会触发过期逻辑。这是Servlet规范定义的默认行为,目的是避免用户正常操作时被强制登出。
二、实现固定20分钟过期(无论有无活动)的方案
如果需要会话从创建起,不管用户有没有操作,20分钟后都强制过期,可以通过以下方式实现:
1. 自定义拦截器+会话创建时间标记
在Spring Boot中添加拦截器,在会话创建时记录时间,每次请求时校验是否超过固定时长:
@Component public class FixedSessionTimeoutInterceptor implements HandlerInterceptor { private static final long FIXED_TIMEOUT = 20 * 60 * 1000; // 20分钟对应的毫秒数 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(false); if (session != null) { // 获取会话创建时间,不存在则初始化 Long createTime = (Long) session.getAttribute("SESSION_CREATE_TIME"); if (createTime == null) { createTime = System.currentTimeMillis(); session.setAttribute("SESSION_CREATE_TIME", createTime); } // 校验是否超过固定时长,超过则销毁会话 if (System.currentTimeMillis() - createTime > FIXED_TIMEOUT) { session.invalidate(); response.sendRedirect("/login"); // 可替换为自定义过期跳转逻辑 return false; } } return true; } }
注册拦截器:
@Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private FixedSessionTimeoutInterceptor fixedSessionTimeoutInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(fixedSessionTimeoutInterceptor).addPathPatterns("/**"); } }
2. 定时任务主动销毁会话
监听会话创建事件,为每个会话绑定定时任务,到期后主动销毁:
@Component public class FixedSessionListener implements HttpSessionListener { private static final long FIXED_TIMEOUT = 20 * 60 * 1000; private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); @Override public void sessionCreated(HttpSessionEvent se) { HttpSession session = se.getSession(); scheduler.schedule(() -> { if (!session.isInvalid()) { session.invalidate(); } }, FIXED_TIMEOUT, TimeUnit.MILLISECONDS); } @Override public void sessionDestroyed(HttpSessionEvent se) { // 可添加资源清理逻辑,避免内存泄漏 } }
注意:这种方式需要考虑服务器重启、会话序列化等场景的兼容性,同时要合理管理定时任务资源。
内容的提问来源于stack exchange,提问作者lauwis
相关产品推荐
相关产品推荐

