使用Shiro+Redis实现Session共享
章节目录
- 1. 为什么要实现Session共享?
- 1.1 负载均衡
- 1.2 负载均衡中的Session问题
- 1.3 案例演示
- 2. Shiro架构
- 3. Shiro集成Redis
1. 为什么要实现Session共享?
说到这个问题,我们先来了解一下负载均衡的概念吧
1.1 负载均衡
当一个项目的访问量很大时,一个Tomcat吃不消,这时候就准备多个Tomcat,由Nginx按照权重来对请求进行分配,从而缓解单独一个Tomcat受到的压力。
如果想进一步了解的话,可以访问网站:Nginx 负载均衡
1.2 负载均衡中的Session问题
通过负载均衡,我们可以把请求分发到不同的 Tomcat 来缓解服务器的压力。但这存在一个问题:当同一个用户第一次访问tomcat:8080,并且登录成功;接着第二次访问时,却被分配到了tomcat:8081, 这里并没有记录他的登陆状态,那么就会呈现未登录状态了,严重影响了用户体验。
1.3 案例演示
或许这样说,比较抽象,就拿这篇博客-------SpringBoot搭建Shiro的快速入门的代码演示吧。
在IDEA中,使用8080和8081端口启动项目。
对同一个SpringBoot项目使用不同端口启动,只需要配置VM参数即可:
D.server.port=端口号
按如下步骤:
1)、Run -> Edit Configurations
2)、填写VM参数
3)、点击左上角“+”,添加一个新的端口号
4)、填写名称,选择主类,填写VM参数
分别启动这两个端口的项目。
- 使用8080端口登录:http://localhost:8080/login
- 登录成功后,使用8081端口访问登录成功界面:http://localhost:8081/success
- 发现8081端口又跳转到了login页面,说明8081端口未登录
上面的问题:我在8080端口登录成功,访问8081端口,发现它没有登录。这就出现了上面的Session问题了。
那么,如何实现8080端口登录成功,8081端口也同时完成登录呢?
解决方法:
- ip_hash:通过ip地址标记用户,如果多次请求都是从同一个ip来的,那么就都分配到同一个tomcat。但这也有缺陷:如果tomcat:8080挂了,那么此时nginx只能把请求交给tomcat:8081,但是这里却没有记录session,用户体验依然受影响
- 使用redis:当tomcat:8080需要保存session值的时候,就可以把它放在Redis上,需要取的时候,也从Redis上取
2. Shiro架构
shiro的整体架构:
上面与会话或缓存相关的组件有:
- Session Manager:会话管理器
- Session DAO:会话 DAO,将session保存到数据库、缓存等
- Cache Manager:缓存管理器,权限认证的缓存、用户及权限信息的缓存等
如果只是做Session共享,只需添加SessionDAO即可。不过为了防止出现缓存不一致性的问题,也将数据一起共享。所以,需要添加以上三个组件。
3. Shiro集成Redis
可查看:shiro-redis整合文档
在这篇博客----一步一步地教你使用SpringBoot集成Shiro 代码的基础上进行修改
1)、POM依赖
<dependency><groupId>org.crazycake</groupId><artifactId>shiro-redis</artifactId><version>3.2.3</version>
</dependency>
2)、ShiroConfig
添加四个Bean
@Bean
public RedisManager redisManager() {// 它可对redis的ip、端口等进行配置RedisManager redisManager = new RedisManager();return redisManager;
}@Bean
public SessionDAO sessionDAO() {RedisSessionDAO redisSessionDAO = new RedisSessionDAO();redisSessionDAO.setRedisManager(redisManager());// session在redis中的保存时间,最好大于session会话超时时间redisSessionDAO.setExpire(100);return redisSessionDAO;
}@Bean
public RedisCacheManager cacheManager() {RedisCacheManager redisCacheManager = new RedisCacheManager();redisCacheManager.setRedisManager(redisManager());//redis中针对不同用户缓存redisCacheManager.setPrincipalIdFieldName("id");//用户权限信息缓存时间redisCacheManager.setExpire(200);return redisCacheManager;
}@Bean
public SessionManager sessionManager() {DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();sessionManager.setSessionDAO(sessionDAO());sessionManager.setCacheManager(cacheManager());// 局会话超时时间(单位毫秒),默认30分钟sessionManager.setGlobalSessionTimeout(10000);// 取消登录成功后url 后面的 JSESSIONIDsessionManager.setSessionIdUrlRewritingEnabled(false);return sessionManager;
}
修改SecurityManager
@Bean
public SecurityManager securityManager() {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setRealm(userRealm());securityManager.setSessionManager(sessionManager());securityManager.setCacheManager(cacheManager());return securityManager;
}
3)、User类要实现Serializable接口,否则启动报错
4)、先启动redis,再启动两个端口项目
5)、使用8080端口登录,使用8081端口访问
8080端口:localhost:8080/login
8080端口登录成功
redis中也是有数据的
8081端口:http://localhost:8081/success
可直接访问,并访问成功。
好了,就这样实现了一个简单的Session共享了。
【参考文章】
SpringBoot shiro集成redis实现session共享
使用Shiro+Redis实现Session共享相关推荐
- Spring Boot分布式系统实践【扩展1】shiro+redis实现session共享、simplesession反序列化失败的问题定位及反思改进...
前言 调试之前请先关闭Favicon配置 spring:favicon:enabled: false 不然会发现有2个请求(如果用nginx+ 浏览器调试的话) 序列化工具类[fastjson版本1. ...
- shiro+redis实现session共享
shiro配置内容
- Tomcat通过Redis实现session共享的完整部署记录
对于生产环境有了一定规模的tomcat集群业务来说,要实现session会话共享,比较稳妥的方式就是使用数据库持久化session.为什么要持久化session(共享session)呢?因为在客户端每 ...
- Rainbond最佳实践:Tomcat配置Redis实现Session共享
Rainbond:生产级无服务器PaaS Rainbond是国内首个开源的生产级无服务器PaaS,深度整合基于Kubernetes的容器管理.多类型CI/CD应用构建与交付.多数据中心的资源管理等技术 ...
- redis实现session共享,哨兵
一.Redis介绍 1.redis是key-value的存储系统,属于非关系型数据库 2.特点:支持数据持久化,可以让数据在内存中保存到磁盘里(memcached:数据存在内存里,如果服务重启,数据会 ...
- 单点登录实现(spring session+redis完成session共享)
一.前言 项目中用到的SSO,使用开源框架cas做的.简单的了解了一下cas,并学习了一下 单点登录的原理,有兴趣的同学也可以学习一下,写个demo玩一玩. 二.工程结构 我模拟了 sso的客户端和s ...
- php 获取cookieid,Redis实现Session共享详解
Redis实现Session共享 这几天在做session共享这么一个小模块,也查了好多资料,给我的感觉,就是太乱了,一直找不到我想要的东西,几乎全部实现方法都与我的想法不一样,在这里,我总结一下自己 ...
- C#session共享+redis_技术干货分享:基于SpringBoot+Redis的Session共享与单点登录
categories: 架构 author: mrzhou tags: SpringBoot redis session 单点登录 基于SpringBoot+Redis的Session共享与单点登录 ...
- 项目分布式部署那些事(1):ONS消息队列、基于Redis的Session共享,开源共享
因业务发展需要现在的系统不足以支撑现在的用户量,于是我们在一周之前着手项目的性能优化与分布式部署的相关动作. 概况 现在的系统是基于RabbitHub(一套开源的开发时框架)和Rabbit.WeiXi ...
最新文章
- 给 Windows 驱动程序安装提速
- input不管用 vue_Vue自定义指令实现快速读取Excel
- Qt Creator用户互动方法
- 【Linux】一步一步学Linux——bind命令(231)
- 如何基于tomcat构建web站点
- 《Web前端开发修炼之道》-读书笔记CSS部分
- 一种快速构造和获取URL查询参数的方法:URLSearchParams
- 从零实现深度学习框架——理解正则化(一)
- 旋转倒立摆的起摆与稳摆---QYC
- HttpServletRequest--request.getParameter /getParameterValues/getParameterNames()/getParameterValues
- centos php ioncube_CentOS 7安装ionCube Loader为php解密组件的方法
- 如何用C#做一个投票小demo
- Oracle数据库限制ip访问
- 中国主要山脉及山峰分布
- php做网络心理测试,php心理测试程序源代码版,求高手帮忙写一个c语言的心理测试程序...
- 测试小兵成长记:磨刀不误砍柴工
- 硬件设备计算存储及数据交互杂谈
- NETSDK1045 当前 .NET SDK 不支持将 .NET 6.0 设置为目标。请将 .NET 5.0 或更低
- Lesson 18 Electric currents in modern art 内容鉴赏
- leaflet 渲染geoJSON数据