SpringSession教程

本文详细介绍了如何将Spring Session与Redis结合,用于管理HttpSession。内容包括Spring Session的基本概念,如集群Session、多用户Session和RESTful API支持。接着讨论了使用Redis作为Session存储的配置,包括基于Java代码和XML的配置方法,以及如何在控制器中使用session。此外,提到了配置注意事项,如session过期时间和Redis连接工厂的设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本概念

Spring Session提供了API和实现,用于管理用户的Session信息。除此之外,它还提供了如下集成:

  1. HttpSession-用于替换应用容器的HttpSession实现,并提供了新的功能,例如集群Session(Clustered Sessions)、多用户Session(Multiple Browser Sessions,即一个浏览器多个用户使用)、RESTful APIs(从HTTP 头信息中获取session id,而不必再依赖于cookie)、单用户创建多个session。
  2. WebSocket-提供在WebSocket协议使用的HttpSession功能,又如在JMS消息的处理代码中。
  3. Spring Session的核心项目并不依赖于Spring框架,所以,我们甚至能够将其应用于不使用Spring框架的项目中。
  4. 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)

@Configurationpublic 
@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管理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值