spring-boot session共享自定义redis的序列化方式

分类:生活杂谈
阅读:206
作者:majingjing
发布:2021-11-19 23:40

[TOC]

redis共享session配置

在启动类上增加如下代码

@EnableRedisHttpSession

观察redis中session数据

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

观察 RedisHttpSessionConfiguration 源码

通过查找 @EnableRedisHttpSession 源码,

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

观察 RedisHttpSessionConfiguration 源码

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

	// 通过set方法来设置 defaultRedisSerializer (非常重要!!!)
  @Autowired(required = false)
	@Qualifier("springSessionDefaultRedisSerializer")
	public void setDefaultRedisSerializer(
			RedisSerializer<Object> defaultRedisSerializer) {
		this.defaultRedisSerializer = defaultRedisSerializer;
	}

...
  // 创建RedisTemplate
  private RedisTemplate<Object, Object> createRedisTemplate() {
		RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
		redisTemplate.setKeySerializer(new StringRedisSerializer());
		redisTemplate.setHashKeySerializer(new StringRedisSerializer());
		
  //如果defaultRedisSerializer有值, 则覆盖默认序列化方式
  	if (this.defaultRedisSerializer != null) {
			redisTemplate.setDefaultSerializer(this.defaultRedisSerializer);
		}
  
		redisTemplate.setConnectionFactory(this.redisConnectionFactory);
		redisTemplate.setBeanClassLoader(this.classLoader);
		redisTemplate.afterPropertiesSet();
		return redisTemplate;
	}

观察 RedisTemplate 源码

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

自定义 redis 序列化方式

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

    @Bean("springSessionDefaultRedisSerializer")
    public RedisSerializer<Object> defaultRedisSerializer(){
        log.debug("Custom Redis Session Serializer load succeeded");
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

        return jackson2JsonRedisSerializer;
    }

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

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