多台服务器的时候,一定会出现在A服务器登录,但是nginx下次分配到了B服务器,这个时候势必会造成系统判定未登录的情况-----解决方式,将session存入redis中进行校验即可
1.演示问题:
(1)启动shiro-springboot的集群项目
(2)修改nginx的配置
(3)测试
(4)登录成功后访问某些资源时,出现了未登录的json提示
2.解决多台服务器的session共享问题
默认session存储再各自服务的内存中,可以让session统一存储在redis中。
疯狂的蛋糕的依赖。---提供了redis存储session的类。
修改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,如果存在则认为当前用户登录