问剑java_Tomcat服务器中Session对象部分属性值丢失问题的分析与解决 | 问剑杂谈...

Tomcat中Session对象部分属性值丢失问题的分析与解决

2017-11-05

我们最近的一个

为了将问题表述清楚,下面我举个例子来详细说明下。我们定义的类信息大概如下图所示:

58a617efbc7267d64eb4d17efde64f79.png

其中,SessionBean是我们将要放到SESSION中的对象,而BaseBean则是SessionBean继承的父类。无论是在开发还是测试环境,SessionBean对象都可以不抛出任何异常地存取值,但是其中的属性则不一定:属性a和属性b在SESSION创建之后,只要SESSION没有失效,就一直可以正常读取其值;但是其中的属性c,只在SESSION创建不久的一段时间内有效,如果一段时间后再取值,属性c的值就变成NULL了。没有任何认为操作,变量值却改变了,是不是很神奇?

【问题根源】

中间的具体排查过程我就不讲了,反正经过好长一段时间的分析和排查,问题的根源终于找到了——BaseBean没有继承Serializable接口!

【原因剖析】

下面我结合上文以及我对

首先,在SESSION创建的时候,SessionBean对象中的所有属性(a、b、c),都可以正常写入到SESSION会话中,这点是没有问题的。对于刚刚创建的SESSION,此时其内容都保存在服务器的内存当中,如果这时候读取SEESION,

而后,无论是因为

通过观察上图中的代码我们不难发现,SessionBean对象已经实现了Serializable接口,所以在将SessionBean对象保存到磁盘的过程中,也就是对对象进行序列化操作的时候,是不会报任何错误的,这也是我们难以通过跟踪错误日志来定位问题的根本原因。但是因为SessionBean的基类BaseBean没有实现Serializable接口,所以BaseBean中的属性c在进行序列化的时候就没能保存下来,进而在反序列化的时候,属性c的值就变成NULL了。所以我们读出的值也莫名其妙变成了NULL也就不难理解了。

【解决方案】

至于解决方案,很简单,给基类BaseBean加个Serializable接口就搞定了嘛。

【问题反思】

此次问题带给我们的反思主要有两个:

第一,对于SESSION会话中保存的类,一定要确保该类以及该类的父类实现了Serializable接口,否则无法将类中的属性序列化。

第二,在进行业务逻辑操作之前,一定要对所有具有不确定性的值的合法性进行安全校验(防御性编程),此次若不是我“多此一举”,在业务逻辑前对这个基本可以认定百分之百正确(因为写入完全可控可信)的属性c进行了合法性校验,这个神奇的问题还说不定什么时候才能发现呢。所以说,防御性编程很重要。

除非特殊说明,本博客文章均为原创,转载请以链接形式标明博文地址。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值