初试spring-session
一、简介
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的更多相关文章
- spring session 和 spring security整合
背景: 我要做的系统前面放置zuul. 使用自己公司提供的单点登录服务.后面的业务应用也是spring boot支撑的rest服务. 目标: 使用spring security管理权限包括权限.用户请 ...
- 基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案
分布式Web网站一般都会碰到集群session共享问题,之前也做过一些Spring3的项目,当时解决这个问题做过两种方案,一是利用nginx,session交给nginx控制,但是这个需要额外工作较多 ...
- Spring Session
开工开工, 准备条件: 1. 本地Redis,官网:http://redis.io/,windows下 https://github.com/ServiceStack/redis-windows ht ...
- Spring boot配合Spring session(redis)遇到的错误
背景:本MUEAS项目,一开始的时候,是没有引入redis的,考虑到后期性能的问题而引入.之前没有引用redis的时候,用户登录是正常的.但是,在加入redis支持后,登录就出错!错误如下: . __ ...
- 使用Spring Session做分布式会话管理
在Web项目开发中,会话管理是一个很重要的部分,用于存储与用户相关的数据.通常是由符合session规范的容器来负责存储管理,也就是一旦容器关闭,重启会导致会话失效.因此打造一个高可用性的系统,必须将 ...
- Spring Session - Spring Boot
The completed guide can be found in the boot sample application. Updating Dependencies Before you us ...
- 单点登录实现(spring session+redis完成session共享)
一.前言 项目中用到的SSO,使用开源框架cas做的.简单的了解了一下cas,并学习了一下 单点登录的原理,有兴趣的同学也可以学习一下,写个demo玩一玩. 二.工程结构 我模拟了 sso的客户端和s ...
- Spring Session实现分布式session的简单示例
前面有用 tomcat-redis-session-manager来实现分布式session管理,但是它有一定的局限性,主要是跟tomcat绑定太紧了,这里改成用Spring Session来管理分布 ...
- 使用Spring Session实现Spring Boot水平扩展
小编说:本文使用Spring Session实现了Spring Boot水平扩展,每个Spring Boot应用与其他水平扩展的Spring Boot一样,都能处理用户请求.如果宕机,Nginx会将请 ...
- XML配置spring session jdbc实现session共享
概述 session的基础知识就不再多说. 通常,我们会把一个项目部署到多个tomcat上,通过nginx进行负载均衡,提高系统的并发性.此时,就会存在一个问题.假如用户第一次访问tomcat1,并登 ...
随机推荐
- Hibernate createQuery调用joincolumn
1. Beans a. Version Bean package locationService.beans; import java.sql.Timestamp; import java.util. ...
- Python 随机生成有效手机号码及身份证
中国那么大,人那么多,几乎人手一部手机.手机号码已经作为各大互联网站的注册账户.同样,身份证更是如此.以下是生成有效手机号码和身份证号. 身份证需要下载districtcode.txt这个文件:htt ...
- js图片大小限制,设置
//图片大小自动脚本 function AutoResizeImage(maxWidth, maxHeight, objImg) { var img = new Image(); img.src = ...
- 数据库表间多对多关系(附带额外字段)的实体类(POJO 或 POCO)表示
介绍 在之前的 Entity Framework 快速上手介绍 之中,两个实体之间只是简单的一对一关系,而在实际的应用场景中,还会出现多对多关系,同时还有可能会出现多对多关系还附带有其他字段的情况. ...
- Win10 + Python + GPU版MXNet + VS2015 + RTools + R配置
最近入手一台GTX 1070的笔记本,手痒想在win10上试下GPU跑模型,所以就有了接下来的安装GPU版mxnet的坎坷历程,经过多重试验终于搞定了python和R安装mxnet,现将主要点记录如下 ...
- 默认路由、RIPv2、OSPF、EIGRP配置(全网全通)
1:默认路由 遇到问题:给r2配置向右的单项默认路由,通过PC1去ping主机PC2,一直显示Request timed out, 解决方法:r2配置如下: r2(config)#ip route 0 ...
- opencv基础到进阶(2)
本文为系列文章的第2篇,主要讲解对图像的像素的操作方法. 2.1存取像素值 为了存取矩阵元素,需要指定元素所在的行和列,程序会返回相应的元素.单通道图像返回单个数值,多通道图像,返回的则是一组向量(V ...
- docker - 关于network的一些理解
docker 提供给我们多种(4种)网络模式,我们可以根据自己的需求来使用.例如我们在一台主机(host)或者同一个docker engine上面运行continer的时候,我们就可以选择bridge ...
- vue2入坑随记(二) -- 自定义动态组件
学习了Vue全家桶和一些UI基本够用了,但是用元素的方式使用组件还是不够灵活,比如我们需要通过js代码直接调用组件,而不是每次在页面上通过属性去控制组件的表现.下面讲一下如何定义动态组件. Vue.e ...
- Azure 基础:Table storage
Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table.其中的 Table 就是本文的主角 Azure Tabl ...