spring-boot session共享自定义redis的序列化方式
生活杂谈
23
皇太极
: 2021-11-19 23:40:31

redis共享session配置

在启动类上增加如下代码

  1. @EnableRedisHttpSession

观察redis中session数据

在spring-boot中使用redis共享session时, 会发现value的默认编码方式我们不能直接观察出里面的内容

观察 RedisHttpSessionConfiguration 源码

通过查找 @EnableRedisHttpSession 源码,

我们可以看到提示: 更多高级配置可以查看 RedisHttpSessionConfiguration

观察 RedisHttpSessionConfiguration 源码

进入RedisHttpSessionConfiguration 代码, 我们可以看到

  1. // 通过set方法来设置 defaultRedisSerializer (非常重要!!!)
  2. @Autowired(required = false)
  3. @Qualifier("springSessionDefaultRedisSerializer")
  4. public void setDefaultRedisSerializer(
  5. RedisSerializer<Object> defaultRedisSerializer) {
  6. this.defaultRedisSerializer = defaultRedisSerializer;
  7. }
  8. ...
  9. // 创建RedisTemplate
  10. private RedisTemplate<Object, Object> createRedisTemplate() {
  11. RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
  12. redisTemplate.setKeySerializer(new StringRedisSerializer());
  13. redisTemplate.setHashKeySerializer(new StringRedisSerializer());
  14. //如果defaultRedisSerializer有值, 则覆盖默认序列化方式
  15. if (this.defaultRedisSerializer != null) {
  16. redisTemplate.setDefaultSerializer(this.defaultRedisSerializer);
  17. }
  18. redisTemplate.setConnectionFactory(this.redisConnectionFactory);
  19. redisTemplate.setBeanClassLoader(this.classLoader);
  20. redisTemplate.afterPropertiesSet();
  21. return redisTemplate;
  22. }

观察 RedisTemplate 源码

可以发现, 此时会对 defaultSerializer 进行判断, 赋默认值

自定义 redis 序列化方式

通过上述代码分析, 我们能清楚的知道, 只需要我们在spring容器中注入 springSessionDefaultRedisSerializer

  1. @Bean("springSessionDefaultRedisSerializer")
  2. public RedisSerializer<Object> defaultRedisSerializer(){
  3. log.debug("Custom Redis Session Serializer load succeeded");
  4. Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
  5. ObjectMapper objectMapper = new ObjectMapper();
  6. objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  7. objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  8. jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
  9. return jackson2JsonRedisSerializer;
  10. }

启动项目, 再次观察redis中的session数据

可以发现, 数据已经是明文了, 方便我们开发调试.

上一篇: