一、简介

  spring-session提供了用户会话信息管理的API和实现。

  它将取代容器中的HttpSession。在没有容器会话集群方案的情况下,使得支持会话集群微不足道。

  它支持在一个浏览器实例中,管理多用户会话。

  接下来,我们将介绍如何在项目中如何使用spring-session。

二、集群session的解决方案

  随着应用访问量的增大,单台机器很难支撑,我们就要部署应用集群,对请求进行分流。

  但是,这样就会存在一个问题,集群中的每个应用的session不是共享的,导致访问出现问题。

  1、使用容器中提供的session集群方案。

    例如:tomcat自己提供了session集群方案。在集群规模比较小的情况下,各个节点中的session相互进行备份,还是可以的。

    但是,如果集群规模比较大,成百上千台,他们节点之间的备份将是非常耗资源的,只适合小规模集群。

  2、session统一存储

    既然容器中的复制不是一个好的选择,我们可以将session后台统一存储,例如:存储到数据库或缓存中。

    spring-session为我们提供了各种存储方式的解决方案,mysql,redis,mongo等。这里我们只介绍redis存储,其他方式请参考官方文档。

三、项目中使用spring-session

  1、在项目的pom.xml中加入spring-session-redis的jar包,在项目的pom.xml文件中加入如下配置:

        <dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>1.2.2.RELEASE</version>
<type>pom</type>
</dependency>

  2、在项目的spring配置文件中加入如下配置:

  <context:annotation-config/>
  <bean id="cookieSerializer" class="org.springframework.session.web.http.DefaultCookieSerializer">
<property name="cookiePath" value="/"/>
<property name="useHttpOnlyCookie" value="false"/>
<!--cookie有效期 单位:秒-->
<property name="cookieMaxAge" value="1800"/>
<property name="domainName" value="${your_domain}"/>
<property name="cookieName" value="${your_cookie_name}"/>
</bean>
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
<property name="cookieSerializer" ref="cookieSerializer"/>
<property name="maxInactiveIntervalInSeconds" value="1800"/>
</bean>
<bean id="jedisConnFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="192.168.2.233"/>
<property name="port" value="6379"/>
<property name="database" value="0"/>
</bean>

  在这里,容器启动时将生成一个springSessionRepositoryFilter,它实现了Filter接口,它负责将HttpSession替换成SpringSession,并将其存储在redis中。

  spring-session是使用RedisConnectionFactory 连接redis的,所以我们创建JedisConnectionFactory 。使用spring-redis的高级配置请参考spring-data-redis文献。

  maxInactiveIntervalInSeconds是Session在redis中的过期时间,这个时间通常与cookie的有效期配置成一样。

  在cookieSerializer中,可以配置cookie的相关信息,域名,cookie名称,httpOnly等。

  3、在web.xml中配置过滤器,拦截所有请求,配置如下:

 <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>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>

    在web.xml中配置过滤器,拦截将所有的请求拦截,通过springSessionRepositoryFilter将HttpSession替换成SpringSession。

    这样,所有的Session都存储到redis中,并且从redis读取,实现了Session的集中管理,又使得应用可以搭建集群。

                                                            作者原创,如有不妥之处,还请见谅

 

  

初试spring-session的更多相关文章

  1. spring session 和 spring security整合

    背景: 我要做的系统前面放置zuul. 使用自己公司提供的单点登录服务.后面的业务应用也是spring boot支撑的rest服务. 目标: 使用spring security管理权限包括权限.用户请 ...

  2. 基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案

    分布式Web网站一般都会碰到集群session共享问题,之前也做过一些Spring3的项目,当时解决这个问题做过两种方案,一是利用nginx,session交给nginx控制,但是这个需要额外工作较多 ...

  3. Spring Session

    开工开工, 准备条件: 1. 本地Redis,官网:http://redis.io/,windows下 https://github.com/ServiceStack/redis-windows ht ...

  4. Spring boot配合Spring session(redis)遇到的错误

    背景:本MUEAS项目,一开始的时候,是没有引入redis的,考虑到后期性能的问题而引入.之前没有引用redis的时候,用户登录是正常的.但是,在加入redis支持后,登录就出错!错误如下: . __ ...

  5. 使用Spring Session做分布式会话管理

    在Web项目开发中,会话管理是一个很重要的部分,用于存储与用户相关的数据.通常是由符合session规范的容器来负责存储管理,也就是一旦容器关闭,重启会导致会话失效.因此打造一个高可用性的系统,必须将 ...

  6. Spring Session - Spring Boot

    The completed guide can be found in the boot sample application. Updating Dependencies Before you us ...

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

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

  8. Spring Session实现分布式session的简单示例

    前面有用 tomcat-redis-session-manager来实现分布式session管理,但是它有一定的局限性,主要是跟tomcat绑定太紧了,这里改成用Spring Session来管理分布 ...

  9. 使用Spring Session实现Spring Boot水平扩展

    小编说:本文使用Spring Session实现了Spring Boot水平扩展,每个Spring Boot应用与其他水平扩展的Spring Boot一样,都能处理用户请求.如果宕机,Nginx会将请 ...

  10. XML配置spring session jdbc实现session共享

    概述 session的基础知识就不再多说. 通常,我们会把一个项目部署到多个tomcat上,通过nginx进行负载均衡,提高系统的并发性.此时,就会存在一个问题.假如用户第一次访问tomcat1,并登 ...

随机推荐

  1. 【LR11】Error -27796: Failed to connect to server"server:port": [10060] Connection timed out错误解决办法

      场景描述:被测系统是发布在远程服务器上的,假设IP是10.10.10.10,端口是8066,那么访问地址是http://10.10.10.10:8066/,在control机器上我设置了IP欺骗. ...

  2. [转]JAVA的动态代理机制及Spring的实现方式

    JAVA 代理实现 代理的实现分动态代理和静态代理,静态代理的实现是对已经生成了的JAVA类进行封装. 动态代理则是在运行时生成了相关代理累,在JAVA中生成动态代理一般有两种方式. JDK自带实现方 ...

  3. Maven测试篇

     maven的生命周期: 讲解Maven测试篇之前将首先介绍一下Maven生命周期的相关概念,如果你熟知这部分概念可以略过此小节内容. 大多数时候,我们在构建一个项目时,不外乎是对其进行清理.编译.测 ...

  4. 【2017-06-01】Linq基础+Lambda表达式实现对数据库的增删改查

    一.Linq to sql 类 高集成化的数据库访问技术 使用Linq可以代替之前的Ado.Net.省去了自己敲代码的实体类和数据访问类的大量工作. 实体类: 添加一个Linq to sql 类 -- ...

  5. 第39篇 免费博客github Pages绑定域名

    原文地址:http://blog.laofu.online/2017/06/02/how-bind-domain/ 网站已经有了,需要对网站来绑定一个自己的个性域名,本人是买了一个阿里云的域名,也就是 ...

  6. SQL注入攻击[详解]

    SQL注入攻击是黑客对数据库进行攻击的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候, ...

  7. 这是假的JS——利用CSS Animation实现banner图非交互循环播放

    话不多说,先来张html和css代码截图~ 注意事项: 1.如果想在每张图前进行停顿,可以在keyframes中的每一步前加上一小段与下一张相同的代码: 2.如果想要在实现无违和感的最后一张与第一张的 ...

  8. iOSNsPredicate Appium 定位元素

    Appium使用WebDriverAgent之后,新增了一种定位方法iOSNsPredicate,总结了一下使用方法: MobileElement photo = driver.findElement ...

  9. Python-快速排序

    算法思想:快速排序运用了分而治之的思想,即在所选数组中选择一个基准(任选一个都可以),以改基准为基础,将小于该基准的元素都移动基准的左边,大于该基准的数据都移动到右边,然后对左右两边进行递归处理.同样 ...

  10. java GUI (课堂笔记)

    关于java GUI Swing组件: JFrame 窗口组件 JLabel 标签 JButton 按钮组件 JTextField 单行文本框 系统控件(JDK自带) 自定义控件(模仿系统控件): 继 ...