当前位置: 首页 > 知识库问答 >
问题:

Tomcat会话反序列化因ClassNotFoundException而失败

山乐生
2023-03-14

我正在尝试让Tomcat在关机时坚持我的会话。我已经解决了这样一个要求,即我在会话中存储的所有内容都是可序列化的,当我在Eclipse下运行Tomcat时,这很好:当代码更改迫使Eclipse重新加载webapp时,会话现在仍然存在。

然而,当我试图在一个独立的Tomcat中做同样的事情时,我遇到了一个问题。

我取消了${catalina.base}/conf/context.xml中的Manager元素的注释,并将pathname属性设置为${catalina.base}/sessions.ser,在关闭时,我会看到sessions.ser文件出现。到目前为止,一切都很好。

[...]
06-Apr-2017 13:39:52.570 SEVERE [localhost-startStop-1] org.apache.catalina.session.StandardManager.startInternal Exception loading sessions from persistent storage
 java.lang.ClassNotFoundException: com.mycompany.wtt.util.LogoutLogger
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1285)
[...]
06-Apr-2017 13:39:54.158 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive /data/tokken/apache-tomcat-8.5.12/webapps/wtt.war has finished in 1,134 ms
[...]

是否有一种方法可以在加载WebApps后让Tomcat反序列化会话?

版本:Tomcat 8.5.12,Java 1.8.0_121。

共有1个答案

冀俊良
2023-03-14

原来,问题是在全局context.xml中配置管理器,并使用绝对路径。这意味着当Tomcat读取序列化会话时,它不知道它属于哪个webapp,显然它只是试图无论如何加载它(加载到它部署的第一个webapp),但由于应用程序特定的类而失败。

我通过将${catalina.home}/conf/context.xml改回其原始状态,注释掉Manager元素,并在WebApp的Meta-INF/context.xml中添加 来使其工作。

请注意,如果您简单地说pathname=“sessions.ser”,那么您的会话将在服务器重新启动时存活下来,但是在应用程序重新部署时它们将无法存活下来,因为后者会破坏应用程序的工作目录,而这是存储具有相对路径名的会话的地方。使用pathname=“${catalina.home}/sessions/wtt.ser”可以避免这种情况(但请确保您希望将会话写入的目录预先存在,因为Tomcat不会为您创建该目录)。

 类似资料: