Springsession redis修改默认的序列化方法是什么
本篇内容介绍了“Springsession 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 源代码如下:
@Beanpublic 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;}@Beanpublic 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中存在旧有的序列化值,更换序列化方法后,要删除旧值,使用新的序列化进行调试,否则会报序列化错误。
“Springsession redis修改默认的序列化方法是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341