展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

解决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,已删除

posted @ 2022-06-25 22:06  DogLeftover  阅读(549)  评论(0)    收藏  举报