文章目录
前言
上一篇文章主要介绍了如何使用SpringSession,其实SpringSession的使用并不是很难,无非就是引入依赖,加下配置。但是,这仅仅只是知其然,要知其所以然,我们还是需要深入源码去理解。在看本文先我们先想想,下面这些问题Session是啥时候创建的呢?通过什么来创建的呢?创建之后如何保存到Redis?又是如何把SessionId设置到Cookie中的呢?带着这一系列的问题,今天就让我们来揭开SpringSession的神秘面纱,如果读者朋友们看完本文之后能够轻松的回答上面的问题,那本文的作用也就达到了。当然,如果您已经对这些知识了若指掌,那么就不需要看本文了。
看源码的过程真的是一个很枯燥乏味的过程,但是弄清楚了其调用过程之后,又是很让人兴奋的,话不多说,直接进入正题。
基础介绍
默认参数的设置
首先,我们从添加的SpringSession的配置类来看起,如下,是一段很基础的配置代码,就添加了@Configuration
注解和@EnableRedisHttpSession
注解。其中@Configuration
注解标注在类上,相当于把该类作为spring的xml配置文件中的<beans>
,作用为:配置spring容器(应用上下文),@EnableRedisHttpSession
注解的作用是使SpringSession生效。
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = -1)
public class SessionConfig {
}
点到EnableRedisHttpSession注解中,我们可以看到里面定义了RedisHttpSessionConfiguration的设置类,以及一些基础参数的设置,例如:session默认的失效时间,存入到redis的key的前缀名,这些我们参数我们在使用注解时都可以重新设置。例如:maxInactiveIntervalInSeconds设置为-1表示用不失效。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(RedisHttpSessionConfiguration.class)
@Configuration
public @interface EnableRedisHttpSession {
//默认最大的失效时间是30分钟
int maxInactiveIntervalInSeconds() default MapSession.DEFAULT_MAX_INACTIVE_INTERVAL_SECONDS(1800秒);
public static final int DEFAULT_MAX_INACTIVE_INTERVAL_SECONDS = 1800;
//存入到redis的key的前缀名
public static final String DEFAULT_NAMESPACE = "spring:session";
String redisNamespace() default RedisOperationsSessionRepository.DEFAULT_NAMESPACE;
}
RedisHttpSessionConfiguration类是一个设置类,内部的作用主要是实例化RedisOperationsSessionRepository对象和RedisMessageListenerContainer对象等以及设置操作redis的工具类。
主要类的说明
![]() | |
---|---|
操作session(生成session,保存session等过程)的时序图
首先,我们先看一下生成Session的调用时序图。
1. 调用的入口还是SessionRepositoryFilter类(PS:Spring是通过责任链的模式来执行每个过滤器的)的doFilterInternal方法。
。。。。。。。。。。。。。。。。。
版权原因,完整文章,请参考如下:SpringSession的源码解析(生成session,保存session,写入cookie全流程分析)