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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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(this.classLoader != null ? this.classLoader :

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值