2017-04-06 73 views
0

我试图让Tomcat在关闭时保留会话。我已经注意到我在会话中存储的所有内容都是可序列化的,并且当我在Eclipse下运行Tomcat时,这样做的效果很好:当代码更改强制Eclipse重新加载WebApp时,会话现在存活。Tomcat会话反序列化失败,ClassNotFoundException异常

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

我已经取消注释的经理元素$ {} catalina.base和/conf/context.xml设定的路径属性为$ {} catalina.base /SESSIONS.ser,并在关机时,我看到会议.ser文件出现。到现在为止还挺好。

但是,当我重新启动Tomcat,这似乎在catalina.out的:

[...] 
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 
[...] 

类com.mycompany.wtt.util.LogoutLogger是wtt.war Web应用程序的一部分,显然,Tomcat的尝试在加载webapp之前反序列化webapp的会话。看起来像这意味着我无法在应用程序中放置特定于应用程序的类,这是一个大问题,因为我的一些逻辑依赖于能够做到这一点,并通过实现javax.servlet.http创建自定义行为.HttpSessionActivationListener。

加载webapps后,有没有办法让Tomcat反序列化会话?

版本:Tomcat 8.5.12,Java 1.8.0_121。

回答

0

事实证明,问题是配置Manager在全球context.xml,绝对路径。这意味着当Tomcat读取序列化会话时,它不知道它属于哪个webapp,显然它只是试图加载它(进入它部署的第一个webapp),并因为应用程序特定的类而失败。

我通过将${catalina.home}/conf/context.xml更改回原来的状态,管理员元素注释掉了,并且在webapp的META-INF/context.xml中添加了<Manager pathname="${catalina.home}/sessions/wtt.ser">

请注意,如果您简单地说pathname="SESSIONS.ser",您的会话将在服务器重新启动后仍然存在,但它们在重新部署应用程序时无法生存,因为后者会破坏应用程序的工作目录,并且这是存储具有相对路径名的会话的地方。说pathname="${catalina.home}/sessions/wtt.ser"可以避免这种情况(但要确保无论您希望会话被写入的目录是否存在,都是因为Tomcat不会为您创建它)。