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

2017-11-05

我们最近的一个Java项目在从开发环境迁移到测试环境之后,遇到了一个非常诡异的问题——在将一个Java对象存储到SESSION会话中而后从中取出时,这个对象的部分属性在SESSION会话刚创建的一段时间内是正确的,但是一段时间过后,虽然SESSION没有失效,但是这部分属性的值却变成NULL了。更令人奇怪的是,无论是变成NULL的属性,还是未变成NULL的属性,都是最简单的String类型变量,实在让人看不明白他们之间到底有何不同。

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

Tomcat Session中数据部分属性值丢失/变为NULL示例代码

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