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

  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中去取。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值