1. pom.xml文件中引入redis的依赖
  2. 在application.xml配置redis:
  1. <bean id="jedisConnectionFactory"
  2. class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
  3. <property name="poolConfig" ref="jedisPoolConfig" />
  4. <property name="usePool" value="true" />
  5. <property name="hostName" value="${redis.host}" />
  6. <property name="port" value="${redis.port}" />
  7. <property name="password" value="${redis.password}" />
  8. <property name="timeout" value="${redis.timeout}" />
  9. <property name="database" value="${redis.database}" />
  10. </bean>
  11. <bean name="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
  12. <property name="maxIdle" value="${redis.maxIdle}" />
  13. </bean>
  14. <!--note: use string template -->
  15. <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"
  16. lazy-init="false">
  17. <property name="connectionFactory" ref="jedisConnectionFactory" />
  18. <property name="keySerializer">
  19. <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
  20. </property>
  21. <property name="valueSerializer">
  22. <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
  23. </property>
  24. </bean>

其中,注意到redisTemplate的序列化属性的配置。

3. shiro配置文件中加入:

  1. <!-- 使用redis存储管理session -->
  2. <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
  3. <!-- 删除失效session -->
  4. <property name="sessionValidationSchedulerEnabled" value="true" />
  5. <!-- session失效时间(毫秒) -->
  6. <property name="globalSessionTimeout" value="1800000" />
  7. <property name="sessionDAO" ref="sessionDao" />
  8. </bean>
  1. <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
  2. <property name="realm" ref="authenticationRealm" />
  3. <property name="cacheManager" ref="shiroCacheManager" />
  4. <property name="sessionManager" ref="sessionManager" />
  5. </bean>

4. 创建SessionDao类继承EnterpriseCacheSessionDAO:

  1. @Repository("sessionDao")
  2. public class SessionDao extends EnterpriseCacheSessionDAO {
  3. @Resource(name = "redisTemplate")
  4. private RedisTemplate redisTemplate;
  5. @Override
  6. protected Serializable doCreate(Session session) {
  7. Serializable sessionId = super.doCreate(session);
  8. redisTemplate.boundValueOps("shiro_session_" + sessionId.toString()).set(session, 30, TimeUnit.MINUTES);
  9. return sessionId;
  10. }
  11. @Override
  12. protected Session doReadSession(Serializable sessionId) {
  13. Session session = super.doReadSession(sessionId);
  14. if (session == null) {
  15. session = (Session) redisTemplate.boundValueOps("shiro_session_" + sessionId.toString()).get();
  16. }
  17. return session;
  18. }
  19. @Override
  20. protected void doUpdate(Session session) {
  21. super.doUpdate(session);
  22. redisTemplate.boundValueOps("shiro_session_" + session.getId()).set(session, 30, TimeUnit.MINUTES);
  23. }
  24. @Override
  25. protected void doDelete(Session session) {
  26. redisTemplate.delete("shiro_session_" + session.getId().toString());
  27. super.doDelete(session);
  28. }
  29. }

redisTemplate中boundValueOps为对key的绑定简化的api,可以通过bound封装指定的key,然后进行一系列的操作而无须“显式”的再次指定Key。

5. 4.在本机上同时运行两个相同项目(端口号不同)测试,开启redis服务,登录其中一个项目成功后,redis客户端显示

再登录另一个项目,发现无需登录,redis客户端只存储一个session。

Shiro结合Redis解决集群中session同步问题的更多相关文章

  1. 集群中Session共享解决方案分析

    一.为什么要Session共享 Session存储在服务器的内存中,比如Java中,Session存放在JVM的中,Session也可以持久化到file,MySQL,redis等,SessionID存 ...

  2. Apache shiro集群实现 (八) web集群时session同步的3种方法

    Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...

  3. redis/分布式文件存储系统/数据库 存储session,解决负载均衡集群中session不一致问题

    先来说下session和cookie的异同 session和cookie不仅仅是一个存放在服务器端,一个存放在客户端那么笼统 session虽然存放在服务器端,但是也需要和客户端相互匹配,试想一个浏览 ...

  4. 关于 tomcat 集群中 session 共享的三种方法

    前两种均需要使用 memcached 或redis 存储 session ,最后一种使用 terracotta 服务器共享. 建议使用 redis,不仅仅因为它可以将缓存的内容持久化,还因为它支持的单 ...

  5. 通过memcached来实现对tomcat集群中Session的共享策略

    近期在做一套集群的实现,实现的方案是在Linux下完成对Apache + Tomcat 负载均衡的功能. 上述功能已经实现,有需要了解的朋友可以看我另外一篇博文. Linux下Apache与Tomca ...

  6. redis之(十五)redis的集群中的哨兵角色

    一:redis集群的哨兵的目的是什么?. (1)监控主redis和从redis数据库是否正常运行 (2)主redis出现故障,自动将其中一台从redis升级为主redis.将原先的主redis转变成从 ...

  7. redis cluster集群中键的分布算法

    Redis Cluster Redis Cluster是Redis的作者 Antirez 提供的 Redis 集群方案 —— 官方多机部署方案,每组Redis Cluster是由多个Redis实例组成 ...

  8. 集群服务器Session同步

    事实上,网站总是有状态的.每一个登录信息.用户信息常常被存储在session内部.而当一个网站被部署在不止一台服务器的时候,就会遇到session同步的问题.事实上即使一个很小的网站,也要至少有两台服 ...

  9. 【转】web集群时session同步的3种方法

    转载请注明作者:海底苍鹰地址:http://blog.51yip.com/server/922.html 在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问 ...

随机推荐

  1. UI Framework-1: UI Development Practices

    UI Development Practices Guidelines Principles for developing for Chrome. These best practices cente ...

  2. 一篇文章教会你理解Scrapy网络爬虫框架的工作原理和数据采集过程

    今天小编给大家详细的讲解一下Scrapy爬虫框架,希望对大家的学习有帮助. 1.Scrapy爬虫框架 Scrapy是一个使用Python编程语言编写的爬虫框架,任何人都可以根据自己的需求进行修改,并且 ...

  3. vue中使用console.log无效

    webpack开发环境下,在vue中使用console.log无效,一直以为webpack出了问题. 使用window.console.log()就能够顺利在浏览器控制台输出了. 以及 在axios请 ...

  4. TCP的连接管理

    创建连接:(三次握手) 第一步: 客户端向服务器发送一个报文,该报文不含有数据段,SYN=1,随机产生sequence number(随机产生可用于避免某些安全性攻击) 第二步: 服务器收到报文,为这 ...

  5. Eclipse StartExplorer插件

    http://www.cnblogs.com/wuxiang/p/5489961.html

  6. 洛谷—— P1003 铺地毯

    https://www.luogu.org/problem/show?pid=1003 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形 ...

  7. 常量成员函数的注意事项 & mutable的使用场景

    mutable的使用场景: 可以在一个const的对象里面,解除对部分字段的const限制.也可以用在const成员函数里面. 对于const与否,一般会调用不同版本的函数: 而对于二元操作符,如果用 ...

  8. easyui combobox 设置值 顺序放在最后

    easyui combobox 设置值 顺序放在最后 如果设置函数.又设置选中的值,注意顺序, 设置值需要放到最后,否则会设置了之后又没有了: $('#spanId'+i).combobox(res) ...

  9. android系统又一次刷ROM简记(一)

    当须要对android系统进行大刀阔斧的改造的时候,应该清晰的了解android各个image的组成才干做到庖丁解牛. 首先在android烧写过程中须要烧写的文件主要包含uboot.bin\boot ...

  10. p2p項目夭折,有種蛋蛋的憂傷。。

      在高考完的暑假就在跟杰哥讨论怎样实现的校内p2p文件共享,就在今天.我们无奈的宣布差点儿夭折. 上图是測试图. 那时候的思路已经完好.就是:"学生上传共享文件到咱们工作室的server. ...