解决session超时不允许再次登录
- 错误回顾
1、配置session会话超时时长,自定义session失效处理 2、设置1个账号不能同时在2台电脑登录 3、redis实现session高可用集群、指定cookie中保存的sessionid名称 4、在实现以上3步操作后,认证通过,无操作等session超时,这时会提示session超时 5、这时再次登录时,会提示账号只能在1台电脑上登录 6、之前在《配置session会话超时时长,自定义session失效处理》这篇博客中处理不能登录的问题,解决方案是重新打开浏览器,或者删除JSESSIONID,才能再次认证 7、这里错误的原因是因为将session交给redis来管理,session超时后,虽然将浏览器中的sessionid删除了,但没有将redis中的sessionid删除
-
新建一个项目demo11,在demo08的基础上开发,整合demo10(redis实现session高可用集群、指定cookie中保存的sessionId名称,但没有整合demo9,所以错误没有复现,这里只记录一下解决方法)
-
在demo11中认证成功后
-
查看redis
-
超时后自定清除浏览器sessionid
-
但并没有清除redis中的sessionid
-
修改
# CustomInvalidSessionStrategy类中添加如下 // 使用构造器注入 private SessionRegistry sessionRegistry; public CustomInvalidSessionStrategy(SessionRegistry sessionRegistry) { this.sessionRegistry = sessionRegistry; } logger.info("getSession().getId(): " + request.getSession().getId()); logger.info("getRequestedSessionId(): " + request.getRequestedSessionId()); sessionRegistry.removeSessionInformation(request.getRequestedSessionId()); # 修改SecurityConfigBean类 @Configuration public class SecurityConfigBean { // 如果容器中还有InvalidSessionStrategy的实现类,则使用新的实现类 // 如果没有,则使用CustomInvalidSessionStrategy来处理session会话超时 // @Bean // @ConditionalOnMissingBean(InvalidSessionStrategy.class) // public InvalidSessionStrategy invalidSessionStrategy() { // return new CustomInvalidSessionStrategy(); // } @Autowired(required=false) private SessionRegistry sessionRegistry; @Bean @ConditionalOnMissingBean(InvalidSessionStrategy.class) public InvalidSessionStrategy invalidSessionStrategy() { return new CustomInvalidSessionStrategy(sessionRegistry); } }
- 再次测试:认证成功
- 超时后,浏览器清除sessionid,redis也清除sessionid
# 控制台打印出要清除的sessionid 09:17:53.606 INFO 29940 --- [nio-8080-exec-1] c.y.s.a.CustomInvalidSessionStrategy : getRequestedSessionId(): 8f400e98-f8bd-41cf-9c56-1fe002fa77ab
- 查看redis,已删除
分类:
权限认证
标签:
Spring Security
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术