You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 19:22:43