shiro session 放入到 redis 中不被序列化以及 SimpleSession 的 transient 属性序列化方式踩到的坑

本文介绍了在将 Shiro Session 存储到 Redis 中时遇到的序列化问题,特别是 SimpleSession 类中 transient 修饰的属性无法正常序列化。通过分析源码,提出了解决方案,包括在 RedisTemplate 配置中指定序列化方式,并解决了由于 ObjectOutputStream 写入 stream header 导致的问题。同时,还进行了字节数组流与普通流序列化的对比测试,以确保序列化的完整性。
摘要由CSDN通过智能技术生成

1、先来说一下 shiro session 序列化到 redis 中的过程

shiro session 放入到 redis 中的 过程(序列化过程):
1、将 shiro 的 SimpleSession 通过 RedisTemple 模板,有两种方案,即 Jackson 和 fastJson ,都是将 Java对象 打成 json,在转成 buty[] 。
补充:在将 Java 对象 打成 Json 的过程中,就是调用我们的 get 方法,拿我们的值,拼出来一个 Json 字符串,然后将 字符串打成 byte[],

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值