Java HttpSession setattribute在qa上抛出非序列化异常,但在本地环境中不抛出

1 java session tomcat httpsession

我保存到会话的对象是a LocalizationContext,它不可序列化,我的Tomcat是5.5.28,而qa服务器是Tomcat 5.5.30.这是来自Tomcat文档:

每当Catalina正常关闭并重新启动,或者触发应用程序重新加载时,标准的Manager实现将尝试将所有当前活动的会话序列化为通过pathname属性定位的磁盘文件.然后,当应用程序重新加载完成时,所有这些保存的会话将被反序列化并激活(假设它们在平均时间内没有过期).

为了成功恢复会话属性的状态,所有这些属性必须实现java.io.Serializable接口.您可以通过<distributable>在Web应用程序部署描述符(/WEB-INF/web.xml)中包含该元素,使Manager强制实施此限制 .

这让我觉得它应该打破我的本地,并且你永远不能在Tomcat中保存会话属性,除非它实现Serializable.

编辑:

对不起,为了更清楚,我的问题是双重的.是否所有会话属性都必须是可序列化的,如果这样做,为什么它仍然可以在我的本地环境中工作?

Vin*_*lds 8

会话属性(以及会话)最好是可序列化的,特别是在开发用户会话只能保留以后再恢复的环境时.这或多或少是群集中会话的故障转移/迁移的先决条件.

但群集并不是会话序列化的唯一方案.在单个容器中,会话可以在容器关闭时保留,并且在容器再次被带回时将被反序列化.当然,这取决于容器支持,包括Tomcat在内的许多容器都支持此功能.

关于错误未在本地环境中显现的原因的理性答案是仅在尝试序列化会话时才标记错误.容器不包括检查会话中的属性值是否可序列化.容器不会执行此检查; 毕竟,这样的测试将包括会话的实际序列化,这可能是性能密集型的,唯一的好处就是防止编程错误.