Spring Session Redis报错反序列化失败、找不到某个类

背景

因项目采用springcloud框架的微服务方式开发,分了有memer、patient、shop、doctor、cas、admin六个项目。其中member、patient、shop为用户端,doctor为医生端,admin为管理端。

我们希望用户端的member、patient、shop能共享session,这样有2个好处:

  1. 能做到一个系统登录,其他系统都登录,减少重复登录
  2. 当一个系统修改session后,其他系统能立即获取最新的session

于是乎,我们使用spring-session-data-redis将session存入redis。但是不生效,各个系统在redis中都存储了各自的一份session,并没有共用,这是为什么?

原来,使用spring将session存入Redis中,默认的cookie path是项目路径,也就是request.getContextPath()。修改办法是在springboot的配置类中,增加一个bean,代码如下:

    @Bean
    public CookieSerializer cookieSerializer() {
        DefaultCookieSerializer defaultCookieSerializer = new DefaultCookieSerializer();
        //cookie名字
        defaultCookieSerializer.setCookieName("sessionId");
        //域
        defaultCookieSerializer.setDomainName("xxx.com");
        //存储路径设为根路径,同一域名下多个项目共享该cookie
        defaultCookieSerializer.setCookiePath("/");
        return defaultCookieSerializer;
    }

这样设置后,有一天在服务端发现了一个错误, org.springframework.data.redis.serializer.SerializationException: Cannot deserialize,java.lang.ClassNotFoundException: com.xxx.xxx.xxx。就是redis反序列化失败,在将redis存储的二进制数据反序列化成java bean时,找不到这个java类

找原因

问题出现了,就得找原因,拉上同事连猜带分析终于明白和上面的设置有关。

cas(单点登录)项目为了方便,也将cookie path设置为了/。但admin项目因无需与其他项目共享session,未设置cooke path,使用默认路径。于是通过cas登录admin的项目后,会发现有2个名为session的cookie,一个path为/aksystem/,另一个为/。如下图:

这样一个请求,2个名为session的cookie都会带到服务端

这2个名为session的cookie,对应到redis中,一个是cas的session,一个是admin的session。

若Cas存储的session中,java bean对象在admin项目中没有。例如,cas的session存储的是User,admin的session中存储的是AdminUser。通过这个名为session的cookie去redis中找到对应的value并反序列化时,就会报错,ClassNotFoundException:xxx.xxx.xxx.User。

解决办法

共享session的项目将cookie path设置为/,不共享session的项目将cookie path设置为项目的contextPath,或者不设置,默认就是contextPath。

前端设置cookie时也要注意,需设置cookie path。前端默认的cookie path是/,若不设置,其他项目也会用到该cookie,导致出现问题。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值