在Web项目开发中,会话管理是一个很重要的部分,用于存储与用户相关的数据。通常是由符合session规范的容器来负责存储管理,也就是一旦容器关闭,重启会导致会话失效。因此打造一个高可用性的系统,必须将session管理从容器中独立出来。而这实现方案有很多种,下面简单介绍下:

  第一种是使用容器扩展来实现,大家比较容易接受的是通过容器插件来实现,比如基于Tomcat的tomcat-redis-session-manager,基于Jetty的jetty-session-redis等等。好处是对项目来说是透明的,无需改动代码。不过前者目前还不支持Tomcat 8,或者说不太完善。个人觉得由于过于依赖容器,一旦容器升级或者更换意味着又得从新来过。并且代码不在项目中,对开发者来说维护也是个问题。

  第二种是自己写一套会话管理的工具类,包括Session管理和Cookie管理,在需要使用会话的时候都从自己的工具类中获取,而工具类后端存储可以放到Redis中。很显然这个方案灵活性最大,但开发需要一些额外的时间。并且系统中存在两套Session方案,很容易弄错而导致取不到数据。

  第三种是使用框架的会话管理工具,也就是本文要说的spring-session,可以理解是替换了Servlet那一套会话管理,既不依赖容器,又不需要改动代码,并且是用了spring-data-redis那一套连接池,可以说是最完美的解决方案。当然,前提是项目要使用Spring Framework才行。

  这里简单记录下整合的过程:

  如果项目之前没有整合过spring-data-redis的话,这一步需要先做,在maven中添加这两个依赖:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>1.5.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session</artifactId>
    <version>1.0.2.RELEASE</version>
</dependency>

  再在applicationContext.xml中添加以下bean,用于定义redis的连接池和初始化redis模版操作类,自行替换其中的相关变量。

<!-- redis -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
</bean>
<bean id="jedisConnectionFactory"
    class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    <property name="hostName" value="${redis.host}" />
    <property name="port" value="${redis.port}" />
    <property name="password" value="${redis.pass}" />
    <property name="timeout" value="${redis.timeout}" />
    <property name="poolConfig" ref="jedisPoolConfig" />
    <property name="usePool" value="true" />
</bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
    <property name="connectionFactory" ref="jedisConnectionFactory" />
</bean>
<!-- 将session放入redis -->
<bean id="redisHttpSessionConfiguration"
class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
    <property name="maxInactiveIntervalInSeconds" value="1800" />
</bean>

  这里前面几个bean都是操作redis时候使用的,最后一个bean才是spring-session需要用到的,其中的id可以不写或者保持不变,这也是一个约定优先配置的体现。这个bean中又会自动产生多个bean,用于相关操作,极大的简化了我们的配置项。其中有个比较重要的是springSessionRepositoryFilter,它将在下面的代理filter中被调用到。maxInactiveIntervalInSeconds表示超时时间,默认是1800秒。写上述配置的时候我个人习惯采用xml来定义,官方文档中有采用注解来声明一个配置类。

  然后是在web.xml中添加一个session代理filter,通过这个filter来包装Servlet的getSession()。需要注意的是这个filter需要放在所有filter链最前面。

<!-- delegatingFilterProxy -->
<filter>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

  这样便配置完毕了,需要注意的是,spring-session要求Redis Server版本不低于2.8。

  验证:使用redis-cli就可以查看到session key了,且浏览器Cookie中的jsessionid已经替换为session。

127.0.0.1:6379> KEYS *
1) "spring:session:expirations:1440922740000"
2) "spring:session:sessions:35b48cb4-62f8-440c-afac-9c7e3cfe98d3"

使用Spring Session做分布式会话管理相关推荐

  1. 在SpringBoot中使用Spring Session解决分布式会话共享问题

    在SpringBoot中使用Spring Session解决分布式会话共享问题 问题描述: 每次当重启服务器时,都会导致会员平台中已登录的用户掉线.这是因为每个用户的会话信息及状态都是由session ...

  2. 在共享dll中使用mfc_在SpringBoot中使用Spring Session解决分布式会话共享问题

    作者:简单的土豆 来源:www.jianshu.com/p/e4191997da56 前言 如果你正在使用Java开发Web应用,想必你对HttpSession非常熟悉,但我们知道HpptSessio ...

  3. 用Spring Security做分布式权限管理 - 卷一基本功

    我们但凡做一个系统,这个系统不是在封闭环境中,不是只给一个人用,为了保证系统与数据安全,那么就会涉及到权限控制,权限控制这个东西可以说是很多系统的基础,因为我们不能让所有人对系统上的所有资源都进行同样 ...

  4. session传递参数_分布式 Session 之 Spring Session 架构与设计

    作者 | 李增光 杏仁后端工程师.「只有变秃,才能变强!」 ​前言 开始进行 Web 开发时,我们可能会遇到这样的情况,当服务器重启之后,之前的登录状态会失效需要重新登录.又或者你的应用程序部署了不止 ...

  5. springmvc atomikos mysql数据源_Spring多数据源分布式事务管理/springmvc+spring+atomikos[jta]+druid+mybatis...

    项目进行读写分离及分库分表,在一个业务中,在一个事务中处理时候将切换多个数据源,需要保证同一事务多个数据源数据的一致性.此处使用atomikos来实现:最后附源码: 1:spring3.0之后不再支持 ...

  6. 分布式会话和基于TOKEN的分布式会话

    单机会话管理 1.基于cookie传输的sessionId:在java tomcat容器session实现 http请求会有一个Session会话管理机制,用来标识用户会话的过程,默认使用的是spri ...

  7. SpringBoot 2 整合 Spring Session 最简操作

    SpringBoot 2 整合 SpringSession 前言 Spring Session 介绍 SpringBoot 快速整合 Spring Session Spring Session 测试 ...

  8. XSS跨站脚本(web应用)——会话管理(一)

    本章目的 普及SESSION,COOKIE会话管理和代码实现掌握Token会话管理了解会话管理的安全问题 Web会话管理概述 会话管理 在人机交互时,会话管理是保持用户的整个会话活动的互动与计算机系统 ...

  9. Spring Java配置:会话超时

    当您可以使用基于Java的配置开发Spring应用程序时,我们生活在一个美好的时光. 不再有多余的XML代码,只有纯Java代码. 在本文中,我想讨论一个关于Spring应用程序中会话管理的热门话题. ...

最新文章

  1. mysql多表统计查询示例
  2. 点评----和时代专线
  3. 连接moogDB数据库
  4. 思科3550 IOS
  5. jquery获得下拉框的值
  6. STM32运行过程中降低系统时钟频率
  7. 完美配置Tomcat的HTTPS
  8. Element-ui中form组件的校验规则
  9. 第一视角:深度学习框架这几年
  10. 中国网络游戏界十大雷囧现象
  11. 零基础如何搭建个人网站,附完整建站步骤!
  12. Android动画全篇系列(二)——补间动画
  13. 北航计算机2018年保研推免经历
  14. MFC之图像绘制---高速绘图控件(High-speed Charting Control)应用(二)
  15. 对青浦区专利工作试点和示范企业给予20万元和30万元资助
  16. mysql内存淘汰_从创建索引过程中内存变化来看SQL Server与MySQL的内存淘汰算法
  17. 《Unity开发实战》——1.3节设置首选项
  18. 移动通信基础(11)跳频
  19. Android设置透明状态栏以及隐藏状态栏
  20. Unity的Gizmos画线

热门文章

  1. html dom createevent,js 中 document.createEvent的用法
  2. matlab 地埋管温度场,地埋管换热器周围土壤冻结温度场的模拟研究
  3. python上下文管理关键字_[宜配屋]听图阁
  4. python3月新增知识点
  5. php调用应用程序api,使用PHP调用openAPI
  6. ansys怎么批量输入点坐标_当SpaceClaim 遇上ANSYS (二)
  7. python 编程该看那些书籍_我用python5年后,我发现学python编程必看的三本书!
  8. MATLAB学习笔记(二)
  9. Leetcode7 :整数反转(JAVA)
  10. Leetcode-520. 检测大写字母