iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >使用Spring Session管理分布式会话时遇到的反序列化问题怎么解决
  • 758
分享到

使用Spring Session管理分布式会话时遇到的反序列化问题怎么解决

2024-04-02 19:04:59 758人浏览 薄情痞子
摘要

这篇文章主要介绍“使用spring Session管理分布式会话时遇到的反序列化问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“使用Spring Sess

这篇文章主要介绍“使用spring Session管理分布式会话时遇到的反序列化问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“使用Spring Session管理分布式会话时遇到的反序列化问题怎么解决”文章能帮助大家解决问题。

  问题浮现

  我们在使用SpringSession时(其实在问题出现时,我们并没有意识到和这儿有关联),遇到了一个隐藏较深的问题。我们像往常一样,在用户登录成功之后,将用户的实体类信息实例化保存到了session中,且session最后保存到了Redis里面,这个过程其实是没有什么问题的。

  随着时间的推移业务的迭代变化,用户实体需要为更新的需求增加额外的字段,于是我们顺其自然的在类中追加其他String类型的属性,结果上了测试环境,发现我们无法进入到登录页面,从浏览器控制台上我们发现这个请求因为无法获取正确的鉴权而不断报302,并且浏览器错误主页提示我们“清除浏览器cookie”,当我们照做之后,登录页面神奇般的可以打开并且我们能够顺利登录系统和使用系统了。在我们回到服务端查看后台日志时,我们看到时在redis中出现了反序列化的问题,而且日志报的很蹊跷,并不是我们的业务代码的某一行直接抛出的日志,这给我们定位问题带了一点麻烦。

  分析问题

  首先反序列化出现问题,我们首先能够想到的就是给用户实体加了额外属性导致的,但是为何会出现反序列化问题呢?原因看起来很简单,我们的用户实体类确实实现了Serializable接口,但是我们并没有显示的写出序列化的serialVersionUID,这在实体变更了属性字段之后反序列化回来,就一定会反序列化失败的,因为在你没有指定序列号serialVersionUID号的时候,系统默认都是以类名称类属性等来自动生成的,不同的属性名称得出的序列化值肯定是不一样的,解决的方法很简单,就是在初始化类的时候,主动写名序列化serialVersionUID号。

  但是我们的程序现在已经在生产环境了,无法做到这一步,因为按照新的类来生成序列号,显然是前后不一致的,给新加的字段加上transient字段?这种做法也步行,这意味着这个字段的值将无法序列化,后面其他系统肯定是使用不了的,这些额外增加的字段就没有存在意义了。

  在对报错日志进行抽丝剥茧逐行分析之后,发现这个异常居然和SpringSession有关系。

  因为我们在用户成功登录系统之后,使用了request.getSession()。setAttribute("xx", "xx")操作,我们将我们的用户实体放到了session中,并由SpringSession成功的放到了Redis里面,并且我们的会话时长是48小时;在我们新的实体更新进来之后,系统一发布,打开登录页面系统对SpringSession中的内容进行初始化,就发现了用户实体无法从Redis中初始化回来,因为前后的序列化号对不上了,于是就疯狂的报反序列化失败,这是根本问题所在。

  解决问题

  那怎么解决呢?很明显,聪明的浏览器给了我们第一个解决方案,那就是清除浏览器Session。

  因为上面我们说到,SpringSession会在浏览器里面自动设置一个名为SESSION的cookie值,这个值是为了后台服务能够在Redis中找到之前存放的Session以便能够识别是统一用户,当浏览器清除了Cookie之后,这个SESSION的值就失去了,于是系统重新为这个浏览器发起请求的用户重新生成SESSION值,这个请求也就无法在redis中找到对应的Session会话,也就没有将用户实体反序列化这个过程,登录程序当然能够正常进行,而且往后的交互都是正常的了。

  那么还有另外的解决方法,从Redis端,既然SpringSession会用这个SESSION去Redis中找对应的值,那么我们就将这个Redis中存放的Session内容进行清除,找不到内容自然就无需反序列化了,不过此时正常访问的用户,也会因为请求没有找到统一的Session而认为是会话过期强制退出。这里在redis中清除内容的方式,可以使用下面的命令:

  $ redis-cli keys '*' | xargs redis-cli del

  $ redis-cli del spring:session:sessions:7e8383a4-082c-4ffe-a4bc-c40fd3363c5e

  第三种方式呢,就是从代码端改造,反序列化失败的本质就是原来的类新增了属性,而且类没有显示的指定序列化serialVersionUID,那么我们变通一下,保持原来的类不变呗,新增的属性放到一个继承了这个用户实体类的类当中,后面我们就用这个新的类,保持老的类不变(属性类型和数量等的都不变),那就行了。是的,就是使用新类的方式,新类继承用户实体类,保持用户实体类不变,新类当中增加需要补充的属性字段,同时需要序列化,这样SpringSession在初始化时,它依然能够反序列找到原来没有变通的那个类,我们自己也能够很好的实现我们新的需求了。

关于“使用Spring Session管理分布式会话时遇到的反序列化问题怎么解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网node.js频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: 使用Spring Session管理分布式会话时遇到的反序列化问题怎么解决

本文链接: https://www.lsjlt.com/news/93638.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用Spring Session管理分布式会话时遇到的反序列化问题怎么解决
    这篇文章主要介绍“使用Spring Session管理分布式会话时遇到的反序列化问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“使用Spring Sess...
    99+
    2024-04-02
  • 在SpringBoot中怎么使用Spring Session解决分布式会话共享问题
    本篇内容介绍了“在SpringBoot中怎么使用Spring Session解决分布式会话共享问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2023-06-16
  • 使用Jackson反序列化遇到的问题及解决
    Jackson反序列化遇到的问题 最近在项目中需要使用Jackson把前台转来的字符转为对象,转换过程中发生了错误,报错如下 ​com.fasterxml.jackso...
    99+
    2024-04-02
  • 详解Redis 分布式锁遇到的序列化问题
    场景描述 最近使用 Redis 遇到了一个类似分布式锁的场景,跟 Redis 实现分布式锁类比一下,就是释放锁失败,也就是缓存删不掉。又踩了一个 Redis 的坑…… 这是什么个情...
    99+
    2024-04-02
  • 如何解决使用Jackson反序列化遇到的问题
    这篇文章主要为大家展示了“如何解决使用Jackson反序列化遇到的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决使用Jackson反序列化遇到的问题”这篇文章吧。Jackson反序列...
    99+
    2023-06-20
  • MongoDB技术开发中遇到的分布式事务管理问题解决方案分析
    MongoDB技术开发中遇到的分布式事务管理问题解决方案分析摘要:随着分布式系统的普及,分布式事务管理成为了一个亟待解决的问题。本文针对MongoDB技术开发中遇到的分布式事务管理问题进行了深入分析,并提出了解决方案。主要包括两阶段提交协议...
    99+
    2023-10-22
    解决方案 MongoDB 分布式事务
  • Java轮询锁使用时遇到的问题怎么解决
    这篇文章主要介绍了Java轮询锁使用时遇到的问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java轮询锁使用时遇到的问题怎么解决文章都会有所收获,下面我们一起来看看吧。问题演示当我们没有使用轮询锁之...
    99+
    2023-06-30
  • 使用JSON.stringify时遇到的循环引用问题怎么解决
    这篇文章给大家分享的是有关使用JSON.stringify时遇到的循环引用问题怎么解决的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。程序员在日常做TypeScript/JavaScript开发时,经常需要将复杂的...
    99+
    2023-06-14
  • Spring Cache怎么使用Redisson分布式锁解决缓存击穿问题
    本篇内容主要讲解“Spring Cache怎么使用Redisson分布式锁解决缓存击穿问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Cache怎么使用Red...
    99+
    2023-06-30
  • 在Vue中使用dhtmlxGantt组件时遇到的问题怎么解决
    本文小编为大家详细介绍“在Vue中使用dhtmlxGantt组件时遇到的问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“在Vue中使用dhtmlxGantt组件时遇到的问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作