章节目录

  • 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参数

分别启动这两个端口的项目。

  1. 使用8080端口登录:http://localhost:8080/login
  2. 登录成功后,使用8081端口访问登录成功界面:http://localhost:8081/success
  3. 发现8081端口又跳转到了login页面,说明8081端口未登录

上面的问题:我在8080端口登录成功,访问8081端口,发现它没有登录。这就出现了上面的Session问题了。

那么,如何实现8080端口登录成功,8081端口也同时完成登录呢?

解决方法:

  1. ip_hash:通过ip地址标记用户,如果多次请求都是从同一个ip来的,那么就都分配到同一个tomcat。但这也有缺陷:如果tomcat:8080挂了,那么此时nginx只能把请求交给tomcat:8081,但是这里却没有记录session,用户体验依然受影响
  2. 使用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共享相关推荐

  1. Spring Boot分布式系统实践【扩展1】shiro+redis实现session共享、simplesession反序列化失败的问题定位及反思改进...

    前言 调试之前请先关闭Favicon配置 spring:favicon:enabled: false 不然会发现有2个请求(如果用nginx+ 浏览器调试的话) 序列化工具类[fastjson版本1. ...

  2. shiro+redis实现session共享

    shiro配置内容

  3. Tomcat通过Redis实现session共享的完整部署记录

    对于生产环境有了一定规模的tomcat集群业务来说,要实现session会话共享,比较稳妥的方式就是使用数据库持久化session.为什么要持久化session(共享session)呢?因为在客户端每 ...

  4. Rainbond最佳实践:Tomcat配置Redis实现Session共享

    Rainbond:生产级无服务器PaaS Rainbond是国内首个开源的生产级无服务器PaaS,深度整合基于Kubernetes的容器管理.多类型CI/CD应用构建与交付.多数据中心的资源管理等技术 ...

  5. redis实现session共享,哨兵

    一.Redis介绍 1.redis是key-value的存储系统,属于非关系型数据库 2.特点:支持数据持久化,可以让数据在内存中保存到磁盘里(memcached:数据存在内存里,如果服务重启,数据会 ...

  6. 单点登录实现(spring session+redis完成session共享)

    一.前言 项目中用到的SSO,使用开源框架cas做的.简单的了解了一下cas,并学习了一下 单点登录的原理,有兴趣的同学也可以学习一下,写个demo玩一玩. 二.工程结构 我模拟了 sso的客户端和s ...

  7. php 获取cookieid,Redis实现Session共享详解

    Redis实现Session共享 这几天在做session共享这么一个小模块,也查了好多资料,给我的感觉,就是太乱了,一直找不到我想要的东西,几乎全部实现方法都与我的想法不一样,在这里,我总结一下自己 ...

  8. C#session共享+redis_技术干货分享:基于SpringBoot+Redis的Session共享与单点登录

    categories: 架构 author: mrzhou tags: SpringBoot redis session 单点登录 基于SpringBoot+Redis的Session共享与单点登录 ...

  9. 项目分布式部署那些事(1):ONS消息队列、基于Redis的Session共享,开源共享

    因业务发展需要现在的系统不足以支撑现在的用户量,于是我们在一周之前着手项目的性能优化与分布式部署的相关动作. 概况 现在的系统是基于RabbitHub(一套开源的开发时框架)和Rabbit.WeiXi ...

最新文章

  1. 给 Windows 驱动程序安装提速
  2. input不管用 vue_Vue自定义指令实现快速读取Excel
  3. Qt Creator用户互动方法
  4. 【Linux】一步一步学Linux——bind命令(231)
  5. 如何基于tomcat构建web站点
  6. 《Web前端开发修炼之道》-读书笔记CSS部分
  7. 一种快速构造和获取URL查询参数的方法:URLSearchParams
  8. 从零实现深度学习框架——理解正则化(一)
  9. 旋转倒立摆的起摆与稳摆---QYC
  10. HttpServletRequest--request.getParameter /getParameterValues/getParameterNames()/getParameterValues
  11. centos php ioncube_CentOS 7安装ionCube Loader为php解密组件的方法
  12. 如何用C#做一个投票小demo
  13. Oracle数据库限制ip访问
  14. 中国主要山脉及山峰分布
  15. php做网络心理测试,php心理测试程序源代码版,求高手帮忙写一个c语言的心理测试程序...
  16. 测试小兵成长记:磨刀不误砍柴工
  17. 硬件设备计算存储及数据交互杂谈
  18. NETSDK1045 当前 .NET SDK 不支持将 .NET 6.0 设置为目标。请将 .NET 5.0 或更低
  19. Lesson 18 Electric currents in modern art 内容鉴赏
  20. leaflet 渲染geoJSON数据

热门文章

  1. 基于java的电话本管理系统
  2. AI 轻松实现动漫角色转换真人,《飞屋环游记》中的小罗竟酷似他……
  3. VScode SSH 远程连接时一直输入密码的问题
  4. 利用js或者后台获取客户ip地址
  5. 【系统辨识】深入浅出分析工具变量法
  6. ocr文字识别工具哪个好用?首选清描图片转文字!
  7. 宝塔 无法自动认证,请填写本地服务器的登录信息!
  8. phpcms V9 自定义制作手机网站的方法
  9. 阿里云docker安装MySQL
  10. 几点减几点怎么列算式_连加、连减