我正在尝试让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。
原来,问题是在全局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不会为您创建该目录)。
有人能帮我修一下吗?
下面是一个重现我的问题的示例项目:https://github.com/deathcoder/hazelcast-shared-session
错误: java.lang.ClassNotFoundException:testprocedure.tp$3在java.net.URLClassLoader$1上运行(未知源)在java.net.URLClassLoader上运行(未知源)在java.security.accessController.doprivileged(本机方法)在java.net.URLClassLoader.find
我应该实现Serializable接口来解决这个问题吗? 错误日志: 代码:
我正在用Spring Boot测试一个微服务架构,但是当Spring Session试图从redis反序列化会话时出现了一个异常。 体系结构如下: 雷迪斯 雷迪斯 网关 网关应用程序.yml 管理 我得到了以下堆栈跟踪。我注意到网关应用程序可以正确反序列化,但它在异常点使用DefaultListableBeanFactory。但Admin应用程序使用此StaticListableBeanFacto