1、先来说一下 shiro session 序列化到 redis 中的过程
|
2、下面是踩坑的详情
1、错误描述:
(1)通过 redis 缓存 shiro 的 session,取值的时候 session 内容为 null
创建时
|
读取时:
|
redis 中读取到的值,可以看到里面空荡荡的:
2、错误原因
因为 shiro 的 Session 是一个 SimpleSession 类,其中属性用 transient 修饰,即不能被序列化
|
3、解决方案
(1)在 redis 配置文件中定义一个不指定序列化方式的 RedisTemplate 的 bean,
使用默认的序列化方式
1 2 3 4 5 6 7 8 9 10 11 |
<!--RedisTemplate:核心组件,明确指定各种序列化的方式--> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connectionFactory-ref="jedisConnectionFactory" p:keySerializer-ref="ss" p:hashKeySerializer-ref="ss" p:hashValueSerializer-ref="fastJson" p:stringSerializer-ref="ss" p:valueSerializer-ref="fastJson"/> <!--解决 session 属性不能序列化,再此中不指定序列化方式,使用默认的--> <bean id="redisTemplate2" class="org.springframework.data.redis.core.RedisTemplate" p:connectionFactory-ref="jedisConnectionFactory"/> |
(2)查看一下 RedisTemplate 的源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperations<K, V>, BeanClassLoaderAware { //。。。 private RedisSerializer<?> defaultSerializer; //。。。
//这是一个回调方法,在注入完成后被调用 public void afterPropertiesSet() { super.afterPropertiesSet(); boolean defaultUsed = false; if (this.defaultSerializer == null) { this.defaultSerializer = new JdkSerializationRedisSerializer |