Spring session redis 修改默认的序列化方法(案例)
一、配置Spring-session-redis 的关键配置如下:
<!-- 设置Cookie domain 和 名称 --> <bean id="defaultCookieSerializer" class="org.springframework.session.web.http.DefaultCookieSerializer"> <property name="domainName" value="${sso.cookie.domain}"/> <property name="cookieName" value="${sso.cookie.name}"/> <property name="cookieMaxAge" value="${sso.cookie.maxage}" /> <property name="cookiePath" value="${sso.cookie.path}" /> <!--<property name="domainNamePattern" value="^.+?\\.(\\w+\\.[a-z]+)$"/>--> </bean> <!-- 配置spring session --> <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"> <!-- session超时设置 --> <property name="maxInactiveIntervalInSeconds" value="${spring.session.expiration}" /> <property name="cookieSerializer" ref="defaultCookieSerializer" /> </bean>
二、查看 RedisHttpSessionConfiguration 源代码如下:
@Bean public RedisTemplate<Object, Object> sessionRedisTemplate( RedisConnectionFactory connectionFactory) { RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>(); template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); if (this.defaultRedisSerializer != null) { template.setDefaultSerializer(this.defaultRedisSerializer); } template.setConnectionFactory(connectionFactory); return template; } @Bean public RedisOperationsSessionRepository sessionRepository( @Qualifier("sessionRedisTemplate") RedisOperations<Object, Object> sessionRedisTemplate, ApplicationEventPublisher applicationEventPublisher) { RedisOperationsSessionRepository sessionRepository = new RedisOperationsSessionRepository( sessionRedisTemplate); sessionRepository.setApplicationEventPublisher(applicationEventPublisher); sessionRepository .setDefaultMaxInactiveInterval(this.maxInactiveIntervalInSeconds); if (this.defaultRedisSerializer != null) { sessionRepository.setDefaultSerializer(this.defaultRedisSerializer); } String redisNamespace = getRedisNamespace(); if (StringUtils.hasText(redisNamespace)) { sessionRepository.setRedisKeyNamespace(redisNamespace); } sessionRepository.setRedisFlushMode(this.redisFlushMode); return sessionRepository; }
创建RedisTemplate时,指定的默认序列化是:StringRedisSerializer,当 defaultRedisSerializer != null 时,重新指定了序列化方法。defaultRedisSerializer 的初始化代码如下:
@Autowired(required = false) @Qualifier("springSessionDefaultRedisSerializer") public void setDefaultRedisSerializer( RedisSerializer<Object> defaultRedisSerializer) { this.defaultRedisSerializer = defaultRedisSerializer; }
因此,我们只需要创建名为 springSessionDefaultRedisSerializer 的Bean,及可修改默认序列化方法。
<bean id="springSessionDefaultRedisSerializer" class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />
注:使用JSON序列化,在特定的场景,会报错,谨慎使用。
三、RedisTemplate 初始化代码如下:
public void afterPropertiesSet() { super.afterPropertiesSet(); boolean defaultUsed = false; if (defaultSerializer == null) { defaultSerializer = new JdkSerializationRedisSerializer( classLoader != null ? classLoader : this.getClass().getClassLoader()); } if (enableDefaultSerializer) { if (keySerializer == null) { keySerializer = defaultSerializer; defaultUsed = true; } if (valueSerializer == null) { valueSerializer = defaultSerializer; defaultUsed = true; } if (hashKeySerializer == null) { hashKeySerializer = defaultSerializer; defaultUsed = true; } if (hashValueSerializer == null) { hashValueSerializer = defaultSerializer; defaultUsed = true; } } if (enableDefaultSerializer && defaultUsed) { Assert.notNull(defaultSerializer, "default serializer null and not all serializers initialized"); } if (scriptExecutor == null) { this.scriptExecutor = new DefaultScriptExecutor<K>(this); } initialized = true; }
可以看出,如果没有指定默认值,使用 JdkSerializationRedisSerializer。
特别提醒:如果已有session中存在旧有的序列化值,更换序列化方法后,要删除旧值,使用新的序列化进行调试,否则会报序列化错误。
特别提醒:如果已有session中存在旧有的序列化值,更换序列化方法后,要删除旧值,使用新的序列化进行调试,否则会报序列化错误。
到此这篇关于Spring session redis 修改默认的序列化方法的文章就介绍到这了,更多相关Spring session redis 修改序列化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringCloud @RefreshScope刷新机制浅析
RefeshScope这个注解想必大家都用过,在微服务配置中心的场景下经常出现,他可以用来刷新Bean中的属性配置,那大家对他的实现原理了解吗?它为什么可以做到动态刷新呢2023-03-03还在用if(obj!=null)做非空判断,带你快速上手Optional
这篇文章主要介绍了还在用if(obj!=null)做非空判断,带你快速上手Optional,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-05-05详解Java设计模式编程中的Flyweight享元模式的开发结构
这篇文章主要介绍了Java设计模式编程中的Flyweight享元模式的开发结构,享元模式能够最大限度地重用现有的同类对象,需要的朋友可以参考下2016-04-04
最新评论