shiro实现session共享(本文转自店蛋蛋)
session共享:在多应用系统中,如果使用了负载均衡,用户的请求会被分发到不同的应用中,A应用中的session数据在B应用中是获取不到的,就会带来共享的问题。
假设:用户第一次访问,连接的A服务器,进行了登录操作进入了系统,当用户再次操作时,请求被转发到了B服务器,用户并没有在B进行登录,此时用户又来到了登录页面,这是难以理解和接受的,这就引出了session共享。
对于shiro框架如何实现session的共享呢?shiro的共享分为两个方面,一个是session的共享,一个是cache的共享。接下来结合redis分别来实现这两个方面。
一.Session的共享
shiro提供了自己的会话管理器sessionManager,其中有个属性叫sessionDao它来处理所有的会话信息。
对于sessionDao,shiro也提供了自己的实现,常用的是ehcache的实现。Ehcache是jvm级别的,多个应用就会产生多个缓存示例,无法做到信息跨进程共享。要实现共享,就要重写sessionDao,通过实现我们自己的Dao,做到同一个会话信息的唯一性。
看下面一幅类图:

1.继承shiro提供的抽象sessionDao,重写create,read,delte等方法。
2.考虑系统的扩展性,我们抽象出一个数据仓储接口,并提供一个redis的实现方式。假如以后我们底层要换成数据库存储session数据,那只需扩展一个数据库的实现类并注入。
二.Cache的共享
同样的,shiro也提供了自己的缓存管理器:cacheManager,重写这个实现,来满足缓存的共享。
看下面的类图:

我们只需实现shiro的CacheManager和Cache接口即可。前者暴漏了获取Cache实例的方法,后者提供了Cache实例的增删改查操作。
中间一层的抽象是为了设计的良好,提供扩展性,后期有需要,只需增加ShiroCacheManager的实现类。
JedisShiroCacheManager中的Cache实例通过ConCurrentHashMap进行缓存,防止对象的反复创建。
三.配置
3.1 Cache配置
<!-- redisManager-->
<bean id ="redisManager" class = "com.yingxinhuitong.shiro.util.RedisManager">
<property name = "host"value = "127.0.0.1"/>
<property name = "port"value = "6379"/>
<property name = "expire"value = "1800"/>
<!--<property name ="password" value=""/>-->
<!--<property name ="timeout" value="0"/>-->
</bean>
<!-- shiro缓存 -->
<bean id = "shrioCacheManager" class ="com.yingxinhuitong.shiro.cache.JedisShiroCacheManager">
<property name ="redisManager" ref = "redisManager"/>
</bean>
<bean id = "shiroJedisManager" class ="com.yingxinhuitong.shiro.cache.CustomShiroCacheManager">
<property name ="shrioCacheManager" ref = "shrioCacheManager"/>
</bean>
3.2 sessionDao配置
<!-- 会话DAO -->
<bean id = "shiroSessionRepository"
class = "com.yingxinhuitong.shiro.session.JedisShiroSessionRepository">
<property name = "redisManager" ref = "redisManager"/></bean>
<bean id = "sessionDAO" class = "com.yingxinhuitong.shiro.session.CustomShiroSessionDao"><property name = "sessionIdGenerator" ref = "sessionIdGenerator"/>
<property name = "shiroSessionRepository" ref = "shiroSessionRepository"/>
</bean>
四.代码
参见:https://github.com/zljk0306/shiro-redis-share
shiro实现session共享(本文转自店蛋蛋)的更多相关文章
- shiro源码篇 - shiro的session共享,你值得拥有
前言 开心一刻 老师对小明说:"乳就是小的意思,比如乳猪就是小猪,乳名就是小名,请你用乳字造个句" 小明:"我家很穷,只能住在40平米的乳房" 老师:" ...
- shiro实现session共享
session共享:在多应用系统中,如果使用了负载均衡,用户的请求会被分发到不同的应用中,A应用中的session数据在B应用中是获取不到的,就会带来共享的问题. 假设:用户第一次访问,连接的A服务器 ...
- 设计模式之装饰模式,session共享的底层原理
前言 还记得当初写spring-session实现分布式集群session的共享的时候,里面有说到利用filter和HttpServletRequestWrapper可以定制自己的getSession ...
- Shiro+Redis实现tomcat集群session共享
一.背景 当我们使用了nginx做项目集群以后,就会出现一个很严重的问题亟待解决,那就是:tomcat集群之间如何实现session共享的问题,如果这个问题不解决,就会出现登陆过后再次请求资源依旧 ...
- Apache shiro集群实现 (六)分布式集群系统下的高可用session解决方案---Session共享
Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...
- 使用redis进行基于shiro的session集群共享
之前写过一篇nginx多tomcat负载均衡,主要记录了使用nginx对多个tomcat 进行负载均衡,其实进行负载均衡之前还有一个问题没有解决,那就是集群间的session共享,不然用户在登录网站之 ...
- Redis+Shiro+Spring-data-redis,共享Session
环境:centos7,Java1.8+,一个Nginx,两个Tomcat,一个Redis. 关于共享session的问题大家都应该知道了,传统的部署项目,两个相同的项目部署到不同的服务器上,Nginx ...
- Shiro如何使用Ehcache实现Session共享
最近项目中用到的Session共享场景:两个独立应用,希望实现DB层共享用户,而且用户只需要登录一次. 分析:这种场合,不适用单点,因为用户数据并不需要单独在第三方应用管理,而且添加单点也会增加整个系 ...
- Spring boot整合redis实现shiro的分布式session共享
我们知道,shiro是通过SessionManager来管理Session的,而对于Session的操作则是通过SessionDao来实现的,默认的情况下,shiro实现了两种SessionDao,分 ...
随机推荐
- [leetcode] 105. Construct Binary Tree from Preorder and Inorder Traversal (Medium)
原题 题意: 根据先序和中序得到二叉树(假设无重复数字) 思路: 先手写一次转换过程,得到思路. 即从先序中遍历每个元素,(创建一个全局索引,指向当前遍历到的元素)在中序中找到该元素作为当前的root ...
- [leetcode] 7. Reverse Integer (easy)
原题 水题 唯一注意的点就是数字溢出 class Solution { public: int reverse(int x) { long long MAX = ((long long)1 <& ...
- Cesium 学习(三)各种资源链接
1.前言 前面已经介绍如何获得以及安装部署Cesium,接下来分享下学习资源链接,其中访问最多的是官网以及超图.火星的demo网站. 2.官网地址及介绍 官网:https://cesiumjs.org ...
- HTML--CSS样式表的基本概念
CSS(Cascading Style Sheet 叠层样式表) 作用:美化HTML网页 (一)样式表分类 一.内联样式表 和HTML联合显示,控制精准,但是可重用性差,冗余多. 例如:<p ...
- 我对微服务、SpringCloud、k8s、Istio的一些杂想
一.微服务与SOA “微服务”是一个名词,没有这个名词之前也有“微服务”,一个朗朗上口的名词能让大家产生一个认知共识,这对推动一个事务的发展挺重要的,不然你叫微服务他叫小服务的大家很难集中到一个点上. ...
- springboot - 登录+静态资源访问+国际化
1.项目目录结构 2.pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmln ...
- Deque 和Queue
概述 接口,一个线性结合,支持在集合首尾add , remove , deque 是double ended queue 的缩写,意味双端队列,接口提供的方法有两种类型,如果失败,一种抛出异常,一种 ...
- 对ThreadLocal的一些理解
ThreadLocal也是在面试过程中经常被问到的,本文主要从以下三个方面来谈对ThreadLocal的一些理解: ThreadLocal用在什么地方 ThreadLocal一些细节 ThreadLo ...
- macOS 安装配置yaf框架 生成yaf项目
macOS 安装配置yaf框架 Yaf只支持PHP5.2及以上的版本. 并支持最新的PHP5.3.3 Yaf需要SPL的支持. SPL在PHP5中是默认启用的扩展模块 Yaf需要PCRE的支持. PC ...
- java课堂 动手动脑3
(1) 该函数没有赋初值再就是如果类提供一个自定义的构造方法,将导致系统不在提供默认的构造方法. (2) public class test { public static void main(Str ...