基本概念
Spring Session提供了API和实现,用于管理用户的Session信息。除此之外,它还提供了如下集成:
- HttpSession-用于替换应用容器的HttpSession实现,并提供了新的功能,例如集群Session(Clustered Sessions)、多用户Session(Multiple Browser Sessions,即一个浏览器多个用户使用)、RESTful APIs(从HTTP 头信息中获取session id,而不必再依赖于cookie)、单用户创建多个session。
- WebSocket-提供在WebSocket协议使用的HttpSession功能,又如在JMS消息的处理代码中。
- Spring Session的核心项目并不依赖于Spring框架,所以,我们甚至能够将其应用于不使用Spring框架的项目中。
- Spring Session 1.0并不支持HttpSessionListener ,但是Spring Session 1.1 M1发布版本已经添加了对它的支持,你可以通过该地址了解更多细节信息。
HttpSession with Redis
在使用之前请增加如下依赖配置
compile group: 'org.springframework.data', name: 'spring-data-redis', version: '1.8.1.RELEASE'
compile group: 'org.springframework.session', name: 'spring-session', version: '1.3.0.RELEASE'
compile group: 'biz.paluch.redis', name: 'lettuce', version: '4.3.1.Final'
Spring Data Redis(SDR)是对访问redis客户端的一个包装适配,支持Jedis,JRedis,SRP,Lettuce四中开源的redis客户端,且从1.7开始,不建议使用JRedis和SRP,官方建议使用lettuce,该实现是采用netty。RedisTemplate是对redis的CRUD的高级封装,而RedisConnection提供了“低级封装”.
参考:
http://docs.spring.io/spring-data/redis/docs/1.7.2.RELEASE/reference/html/ Spring Data Redis官方文档
基于Java代码的配置
需要有两个步骤,如下:
- 1. 创建redis连接工厂和springSessionRepositoryFilter过滤器
在配置类中增加注解@EnableRedisHttpSession,该注解会默认创建(但并不会注册,需要手动注册)过滤器springSessionRepositoryFilter,该过滤器会替换容器的HttpSession实现,而其内部的实现将会采用redis。
在配置类内,必须注册RedisConnectionFactory Bean,该bean将会用于管理对redis的链接。默认的链接端口是6379,访问的是本地地址。
//@Configuration 不需要
@EnableRedisHttpSession
public class Config {
@Bean
public LettuceConnectionFactory connectionFactory() {
return new LettuceConnectionFactory();
}
}
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target({ java.lang.annotation.ElementType.TYPE })
@Documented
@Import(RedisHttpSessionConfiguration.class)
@Configuration
public
@interface EnableRedisHttpSession
注意:
- 配置类中不需要再使用@Configuration注解,因为EnableRedisHttpSession已经包含有。
- EnableRedisHttpSession的核心是使用了Import方式导入了RedisHttpSessionConfiguration.class配置类。该配置类通过@Bean注解,向Spring容器中注册了一个SessionRepositoryFilter(SessionRepositoryFilter的依赖关系:SessionRepositoryFilter –> SessionRepository –> RedisTemplate –> RedisConnectionFactory)。
- 不要讲该配置类注册在servletApplicationContext,必须注册在rootApplicationContext
- Spring Session定义了HttpSessionStrategy接口以及两个默认实现,即CookieHttpSessionStrategy和HeaderHttpSessionStrategy,其中前者使用HTTP cookie将请求与session id关联,而后者使用HTTP header将请求与session关联,默认是基于CookieHttpSessionStrategy实现(SpringHttpSessionConfiguration.java)
EnableRedisHttpSession可以配置session过期时间(maxInactiveIntervalInSeconds),默认30分钟,还可以设置redisFlushMode,即session更新策略,有ON_SAVE、IMMEDIATE,前者是在调用SessionRepository#save(org.springframework.session.Session)时,在response commit前刷新缓存,后者是只要有任何更新就会刷新缓存。默认情况下,session存储在redis的key是“spring:session:”,但如果有多个系统同时使用一个redis,则会冲突,此时应该配置redisNamespace值,配置后,其key为spring:session::
参考:
http://www.sjsjw.com/104/002313MYM000506/ 利用springsession解决共享Session问题
http://blog.csdn.net/xiejx618/article/details/50603758 springmvc启动过程
- 2. 将springSessionRepositoryFilter过滤器注册到servlet filter
默认的方式是实现AbstractHttpSessionApplicationInitializer抽象类,如下:
public class Initializer extends AbstractHttpSessionApplicationInitializer {
}
- 3. 在controller中使用session
@RequestMapping(path = "/all", method= RequestMethod.GET)
public ModelAndView loadAllFilters(HttpServletRequest request){
HttpSession session=request.getSession();
return new ModelAndView("filter/filter_list", Maps.<String, Object>newHashMap());
}
展示结果:
127.0.0.1:6379> keys *
1) "spring:session:m-config:expirations:1490545740000"
2) "spring:session:m-config:sessions:093fdf05-3107-40f7-8d0c-f8458461c61f"
3) "spring:session:m-config:sessions:8c5931bb-179e-4b2c-9db1-3d4656ddaff0"
4) "spring:session:m-config:sessions:d265a908-fbd9-4925-9f61-8d2bcdb47225"
参考:
http://docs.spring.io/spring-data/data-redis/docs/current/reference/html/ Spring Data Redis
http://blog.csdn.net/xiejx618/article/details/42919327 spring session入门
基于XML的配置
待续
参考:
http://docs.spring.io/spring-session/docs/current/reference/html5/ Spring Session
http://www.cnblogs.com/zjrodger/p/5800593.html Spring整合Redis(第一篇)—SDR简述
http://www.cnblogs.com/beyang/p/6104802.html 使用Spring Session做分布式会话管理
http://www.infoq.com/cn/articles/Next-Generation-Session-Management-with-Spring-Session 通过Spring Session实现新一代的Session管理