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

时间:2010-08-11 15:49:48

标签: java session tomcat httpsession

我保存到会话的对象是LocalizationContext,它不可序列化,我的Tomcat是5.5.28,而qa服务器是Tomcat 5.5.30。这来自the Tomcat docs

  

每当卡塔利娜被关闭时   正常并重新启动,或当   应用程序重新加载被触发了   标准的Manager实现会   尝试序列化所有当前   活动会话到磁盘文件位于   通过pathname属性。所有这些   然后保存的会话将是   反序列化和激活(假设   他们的意思并没有过期   时间)当应用程序重新加载时   完成。

     

为了成功恢复   会话属性的状态,所有这些   属性必须实现   java.io.Serializable接口。您   可能导致管理器强制执行此操作   限制包括   您网络中的<distributable>元素   应用部署描述符   符(/WEB-INF/web.xml)。

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

修改

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

1 个答案:

答案 0 :(得分:8)

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

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

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