Spring?session?redis?修改默認(rèn)的序列化方法(案例)
一、配置Spring-session-redis 的關(guān)鍵配置如下:
<!-- 設(shè)置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超時(shí)設(shè)置 -->
<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;
}
創(chuàng)建RedisTemplate時(shí),指定的默認(rèn)序列化是:StringRedisSerializer,當(dāng) defaultRedisSerializer != null 時(shí),重新指定了序列化方法。defaultRedisSerializer 的初始化代碼如下:
@Autowired(required = false)
@Qualifier("springSessionDefaultRedisSerializer")
public void setDefaultRedisSerializer(
RedisSerializer<Object> defaultRedisSerializer) {
this.defaultRedisSerializer = defaultRedisSerializer;
}因此,我們只需要?jiǎng)?chuàng)建名為 springSessionDefaultRedisSerializer 的Bean,及可修改默認(rèn)序列化方法。
<bean id="springSessionDefaultRedisSerializer" class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />
注:使用JSON序列化,在特定的場(chǎng)景,會(huì)報(bào)錯(cuò),謹(jǐn)慎使用。
三、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;
}
可以看出,如果沒有指定默認(rèn)值,使用 JdkSerializationRedisSerializer。
特別提醒:如果已有session中存在舊有的序列化值,更換序列化方法后,要?jiǎng)h除舊值,使用新的序列化進(jìn)行調(diào)試,否則會(huì)報(bào)序列化錯(cuò)誤。
特別提醒:如果已有session中存在舊有的序列化值,更換序列化方法后,要?jiǎng)h除舊值,使用新的序列化進(jìn)行調(diào)試,否則會(huì)報(bào)序列化錯(cuò)誤。
到此這篇關(guān)于Spring session redis 修改默認(rèn)的序列化方法的文章就介紹到這了,更多相關(guān)Spring session redis 修改序列化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot和Jpa實(shí)現(xiàn)學(xué)生CRUD操作代碼實(shí)例
這篇文章主要介紹了Springboot和Jpa實(shí)現(xiàn)學(xué)生CRUD操作代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
Java Web開發(fā)中過濾器和監(jiān)聽器使用詳解
這篇文章主要為大家詳細(xì)介紹了Java中的過濾器Filter和監(jiān)聽器Listener的使用以及二者的區(qū)別,文中的示例代碼講解詳細(xì),需要的可以參考一下2022-10-10
Java最常用的6個(gè)簡(jiǎn)單的計(jì)算題
本篇文章給大家整理的在JAVA中最常用到的簡(jiǎn)單的計(jì)算題,對(duì)此有興趣的朋友可以測(cè)試參考下。2018-02-02
Springboot實(shí)現(xiàn)發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了Springboot實(shí)現(xiàn)發(fā)送郵件功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
詳談java線程與線程、進(jìn)程與進(jìn)程間通信
下面小編就為大家?guī)硪黄斦刯ava線程與線程、進(jìn)程與進(jìn)程間通信。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04

