解决集群session不共享导致的需要重复登录问题---shiro中session的共享问题--基本跨域问题

341 阅读1分钟

多台服务器的时候,一定会出现在A服务器登录,但是nginx下次分配到了B服务器,这个时候势必会造成系统判定未登录的情况-----解决方式,将session存入redis中进行校验即可

image.png

1.演示问题:

(1)启动shiro-springboot的集群项目

image.png

(2)修改nginx的配置

image.png

(3)测试

image.png

(4)登录成功后访问某些资源时,出现了未登录的json提示

image.png

2.解决多台服务器的session共享问题

默认session存储再各自服务的内存中,可以让session统一存储在redis中。

疯狂的蛋糕的依赖。---提供了redis存储session的类。

image.png

修改shiro配置配置类

@Bean
public DefaultWebSecurityManager securityManager(){
    final DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
    manager.setRealm(myRealm());
    //加载redis
    manager.setCacheManager(redisCacheManager());
    //设置session管理器
    manager.setSessionManager(sessionManager());
    return manager;
}

@Bean
public SessionManager sessionManager(){
    final DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
    // 设置要由会话管理器使用的会话DAO。
    sessionManager.setSessionDAO(sessionDAO());
    // 返回会话管理器对象。
    return sessionManager;
}

//该类会对session进行CRUD操作
@Bean
public SessionDAO sessionDAO(){
    final RedisSessionDAO sessionDAO = new RedisSessionDAO();
    // 创建RedisManager的新实例,并设置要连接的主机。
    RedisManager redisManager = new RedisManager();
    redisManager.setHost("192.168.94.131:6379");
    // 设置RedisSessionDAO应使用的RedisManager对象。
    sessionDAO.setRedisManager(redisManager);
    // 返回会话DAO对象。
    return sessionDAO;
}

DefaultWebSecurityManager会获取请求头中JSESSIONID的值,通过RedisSessionDao从redis中查询该值对应的key,如果存在则认为当前用户登录