- 启动类中添加
@EnableRedisHttpSession
- 配置类中添加
spring:
session:
store-type: redis
配置session失效时间
server:
servlet:
session:
timeout: 30m # session失效时间设置为30分钟
- 编写一个session配置文件
@Configuration
public class GulimallSessionConfig {
@Bean
public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
// 将存入session的数据进行json格式序列化
return new GenericJackson2JsonRedisSerializer();
}
@Bean
public CookieSerializer cookieSerializer() {
DefaultCookieSerializer serializer = new DefaultCookieSerializer();
// 定义cookieName
serializer.setCookieName("GULISESSIONID");
// 定义作用域
serializer.setDomainName("gulimall.com");
return serializer;
}
}
- 分布式session原理
(1)注解@EnableRedisHttpSession中引入了RedisHttpSessionConfiguration,里面会初始化RedisSerializer,也就是上面配置好的springSessionDefaultRedisSerializer;
(2)RedisHttpSessionConfiguration中也会配置sessionRepository,也就是配置session的仓库,这里配置的就是redis仓库
@Bean
public RedisIndexedSessionRepository sessionRepository() {
RedisTemplate<Object, Object> redisTemplate = this.createRedisTemplate();
RedisIndexedSessionRepository sessionRepository = new RedisIndexedSessionRepository(redisTemplate);
sessionRepository.setApplicationEventPublisher(this.applicationEventPublisher);
(3)继承的SpringHttpSessionConfiguration中会初始化
@PostConstruct
public void init() {
CookieSerializer cookieSerializer = this.cookieSerializer != null ? this.cookieSerializer : this.createDefaultCookieSerializer();
this.defaultHttpSessionIdResolver.setCookieSerializer(cookieSerializer);
}
也就是我们上面配置的cookieSerializer。
(4)最后统一走一个filterSessionRepositoryFilter
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
request.setAttribute(SESSION_REPOSITORY_ATTR, this.sessionRepository);
SessionRepositoryFilter<S>.SessionRepositoryRequestWrapper wrappedRequest = new SessionRepositoryFilter.SessionRepositoryRequestWrapper(request, response);
SessionRepositoryFilter.SessionRepositoryResponseWrapper wrappedResponse = new SessionRepositoryFilter.SessionRepositoryResponseWrapper(wrappedRequest, response);
try {
filterChain.doFilter(wrappedRequest, wrappedResponse);
} finally {
wrappedRequest.commitSession();
}
}
也就是会将reqeust和response二次封装,以后实际代码里通过request和response取值设值的话都是走的wrappedRequest和wrappedResponse,也就是session和配置文件全部关联起来了,也就是session会存到redis中,取出的时候session也会从redis中去取。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)