我保存到会话的对象是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
。
修改
对不起,为了更清楚,我的问题是双重的。是否所有会话属性都必须是可序列化的,如果这样做,为什么它仍然可以在我的本地环境中工作?
答案 0 :(得分:8)
会话属性(以及会话)最好是可序列化的,尤其是在开发用户会话可以保留以便以后恢复的环境时。这或多或少是群集中会话的故障转移/迁移的先决条件。
但群集并不是会话序列化的唯一方案。在单个容器中,会话可以在容器关闭时保留,并且在容器再次被带回时将被反序列化。当然,这取决于容器支持,包括Tomcat在内的许多容器都支持此功能。
关于错误未在本地环境中显示的原因的合理答案是,只有在尝试序列化会话时才会标记错误。容器不包括检查会话中的属性值是否可序列化。容器不会执行此检查;毕竟,这样的测试将包括会话的实际序列化,这可能是性能密集型的,唯一的好处就是防止编程错误。