1

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

每当 Catalina 正常关闭并重新启动时,或者当触发应用程序重新加载时,标准管理器实现将尝试将所有当前活动的会话序列化到通过路径名属性定位的磁盘文件。当应用程序重新加载完成时,所有这些保存的会话将被反序列化并激活(假设它们同时没有过期)。

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

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

编辑:

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

4

1 回答 1

8

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

但是集群并不是会话将被序列化的唯一场景。在单个容器中,会话可以在容器关闭时保持,并在容器再次恢复时进行反序列化。这当然取决于容器的支持,包括Tomcat在内的很多容器都支持这个特性。

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

于 2010-08-11T16:24:59.443 回答