您的位置:首页 > 编程语言 > Java开发

springsession学习

2018-01-14 21:31 92 查看
为什么需要使用session?
因为Http协议是无状态的,如果服务端需要识别具体的连接对象,则需要使用sessionID
在浏览器第一次访问服务器的时候,服务器端会生成一个唯一的sessisonID,这个sessionID既保存在访问的服务器中,也通过cookie返回浏览器端
浏览器再次访问的时候,一般会通过cookie中将sessionID传到服务器端,服务器端根据拿到的sessionID去服务器中保存sessionID的表中寻找是否有匹配的
如果浏览器端禁用了cookie,那么会使用一种叫做URL重写的技术来进行session会话跟踪,即每次http交互,url后面都会加上一个sessionid=xxx,服务器端以此来识别客户端

通常情况下,session由容器(tomcat/jetty)来负责存储和管理

但是,在集群模式下,多态tomcat来管理session存在问题,因为session无法做到在多台tomcat共享

比如

1、多台tomcat之间无法共享session,比如用户在tomcat A服务器上已经登录了,但当负载均衡跳转到tomcat B时,由于tomcat B服务器并没有用户的登录信息,session就失效了,用户就退出了登录;

2、一旦tomcat容器关闭或重启也会导致session会话失效;

那么,如何解决集群模式下的session管理问题?

四种方案

1、使用容器扩展来实现,比如基于Tomcat的tomcat-redis-session-manager插件,基于Jetty的jetty-session-redis插件、memcached-session-manager插件;
这个方案的好处是对项目来说是透明的,无需改动代码,但是由于过于依赖容器,一旦容器升级或者更换意味着又得从新来过;

2、使用Nginx负载均衡的ip_hash策略实现用户每次访问都绑定到一台具体的后台tomcat服务器实现session总是存在;
存在问题:1、如果某台存有session的tomcat故障,则其中的session也无法使用;2、客户端网络环境可能导致其ip发生变化

3、自己写一套Session会话管理的工具类,在需要使用会话的时候都从自己的工具类中获取,而工具类后端存储可以放到Redis中
这个方案灵活性很好,但开发需要一些额外的时间;

4、使用框架的会话管理工具,即springsession
既不依赖tomcat容器,又不需要改动代码,由Spring session框架为我们提供,可以说是目前非常完美的session共享解决方案;

springsession简介

springsession是Spring家族中的一个子项目,它提供一组API和实现,用于管理用户的session信息;

springsession把servlet容器实现的HttpSession替换为spring-session,专注解决session管理问题,session信息存储在Redis中,可简单快速无缝集成到应用中

在eclipse中开发简单的springsession管理session项目

1、添加依赖
<!-- Spring session redis 依赖start -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>
<!-- Spring session redis 依赖end -->
<!-- jedis依赖的JAR配置start -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<!-- jedis依赖的JAR配置end -->

2、在application-mvc.xml中添加配置
<!-- Spring session 的配置类 -->
<bean
class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration" />

<!-- jedis Connection Factory -->
<bean id="jedisConnectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:usePool="true" p:hostName="192.168.243.128" p:port="6379" p:timeout="8000"
p:password="123456" />
<!--这个配置或者不配置都可以-->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> 
<property name="maxTotal" value="100" /> 
<property name="maxIdle" value="10" /> 
</bean> 

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>
</filter-mapping>

在idea中集成springboot使用springsession,

1、添加依赖
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、在配置文件application.properties中配置redis连接
spring.redis.host=192.168.230.128
spring.redis.port=6379
spring.redis.password=12345

3、在运行的主类(Application)上添加@EnableRedisHttpSession注解
或者在配置文件application.properties中添加spring.session.store-type=redis

集群环境下实现session共享示意图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  springsession redis