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è)置 --> <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時,指定的默認(rèn)序列化是:StringRedisSerializer,當(dāng) defaultRedisSerializer != null 時,重新指定了序列化方法。defaultRedisSerializer 的初始化代碼如下:
@Autowired(required = false) @Qualifier("springSessionDefaultRedisSerializer") public void setDefaultRedisSerializer( RedisSerializer<Object> defaultRedisSerializer) { this.defaultRedisSerializer = defaultRedisSerializer; }
因此,我們只需要創(chuàng)建名為 springSessionDefaultRedisSerializer 的Bean,及可修改默認(rèn)序列化方法。
<bean id="springSessionDefaultRedisSerializer" class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />
注:使用JSON序列化,在特定的場景,會報錯,謹(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中存在舊有的序列化值,更換序列化方法后,要刪除舊值,使用新的序列化進行調(diào)試,否則會報序列化錯誤。
特別提醒:如果已有session中存在舊有的序列化值,更換序列化方法后,要刪除舊值,使用新的序列化進行調(diào)試,否則會報序列化錯誤。
到此這篇關(guān)于Spring session redis 修改默認(rèn)的序列化方法的文章就介紹到這了,更多相關(guān)Spring session redis 修改序列化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JAVA使用前綴樹(Tire樹)實現(xiàn)敏感詞過濾、詞典搜索
本文主要介紹了JAVA使用前綴樹(Tire樹)實現(xiàn)敏感詞過濾、詞典搜索,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01如何在mapper文件中使用in("str1","str2")
這篇文章主要介紹了如何在mapper文件中使用in("str1","str2"),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01SpringBoot詳細分析自動裝配原理并實現(xiàn)starter
相對于傳統(tǒng)意義上的Spring項目,SpringBoot具有開箱即用,簡化配置,內(nèi)置Tomcat等等等等一系列的特點。在這些特點中,最重要的兩條就是約定優(yōu)于配置和自動裝配2022-07-07IDEA設(shè)置Maven自動編譯model的實現(xiàn)方法
本文主要介紹了IDEA設(shè)置Maven自動編譯model的實現(xiàn)方法, maven結(jié)構(gòu)的項目,我們在每次修改代碼后都會需要手動編譯,本文就可以解決這個問題,感興趣的可以了解一下2023-08-08