分布式开发(6)-基于redis分布式session

2023-05-16

  1. 启动类中添加@EnableRedisHttpSession
  2. 配置类中添加
spring:
  session:
    store-type: redis

配置session失效时间

server:
  servlet:
    session:
      timeout: 30m # session失效时间设置为30分钟
  1. 编写一个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;
    }
}
  1. 分布式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(使用前将#替换为@)

分布式开发(6)-基于redis分布式session 的相关文章

随机推荐