Spring Session过期时expiredSessionStrategy未触发的问题排查
为什么expiredSessionStrategy未触发?
以下是几个核心原因:
1. 适用场景不匹配
expiredSessionStrategy是Spring Security专门处理同一用户并发登录导致旧会话被强制失效的逻辑,只在用户重复登录踢掉旧会话时触发,完全不负责处理会话自然超时过期的场景。你之前用expiredUrl时能跳转,大概率是旧会话被踢时触发的,而AJAX遇到的是会话自然过期,这个策略本来就不会生效。
2. Spring Session与Spring Security的会话生命周期分离
当使用Spring Session(比如Redis存储会话)时,会话的过期清理是由Spring Session的定时任务完成的,这个过程不会通知Spring Security的expiredSessionStrategy。只有Spring Security主动触发的会话失效(比如并发登录踢下线),才会走这个策略的逻辑。
3. SessionRegistry同步异常
如果你的sessionRegistry()没有正确同步Spring Session的会话状态,Spring Security无法感知到会话的存在与过期状态,自然也不会触发对应的策略。需要确保使用SpringSessionBackedSessionRegistry来对接Spring Session,而不是普通的SessionRegistryImpl。
验证方法
- 用同一账号在另一设备登录,然后回到原设备发起请求,看控制台是否打印
URI=xxx,如果打印说明策略在并发踢下线场景下正常工作,只是自然过期场景不适用。 - 针对会话自然过期的AJAX请求,还是需要用
AjaxAwareAuthenticationEntryPoint这类自定义认证入口点来返回JSON错误,而不是依赖expiredSessionStrategy。
内容的提问来源于stack exchange,提问作者shirdisai
相关产品推荐
相关产品推荐

