session共享:在多应用系统中,若是使用了负载均衡,用户的请求会被分发到不一样的应用中,A应用中的session数据在B应用中是获取不到的,就会带来共享的问题。java
假设:用户第一次访问,链接的A服务器,进行了登陆操做进入了系统,当用户再次操做时,请求被转发到了B服务器,用户并无在B进行登陆,此时用户又来到了登陆页面,这是难以理解和接受的,这就引出了session共享。git
对于shiro框架如何实现session的共享呢?shiro的共享分为两个方面,一个是session的共享,一个是cache的共享。接下来结合redis分别来实现这两个方面。github
一.Session的共享redis
shiro提供了本身的会话管理器sessionManager,其中有个属性叫sessionDao它来处理全部的会话信息。数据库
对于sessionDao,shiro也提供了本身的实现,经常使用的是ehcache的实现。Ehcache是jvm级别的,多个应用就会产生多个缓存示例,没法作到信息跨进程共享。要实现共享,就要重写sessionDao,经过实现咱们本身的Dao,作到同一个会话信息的惟一性。缓存
看下面一幅类图:服务器
1.继承shiro提供的抽象sessionDao,重写create,read,delete等方法。微信
2.考虑系统的扩展性,咱们抽象出一个数据仓储接口,并提供一个redis的实现方式。假如之后咱们底层要换成数据库存储session数据,那只需扩展一个数据库的实现类并注入。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
关注老姜谈技术,微信号:helojava,或者扫描下面二维码。