从 Tomcat 6 JDK 1.6 迁移到 Tomcat 7 JDK 1.7 会话问题

Posted

技术标签:

【中文标题】从 Tomcat 6 JDK 1.6 迁移到 Tomcat 7 JDK 1.7 会话问题【英文标题】:Migrating from Tomcat 6 JDK 1.6 to Tomcat 7 JDK 1.7 Session Issues 【发布时间】:2014-04-15 18:38:31 【问题描述】:

我们将在 Tomcat 6 和 JDK 1.6 中正常运行的应用程序迁移到 Tomcat 7 JDK 1.7。部署到Tomcat 6 的WAR 在Tomcat 7 中可以正常工作。但是在JDK 1.7 下编译的WAR 导致的是,如果我们点击UI 中的任何链接,它会立即报告会话超时。 我们将 MyFaces 2.0.7 与 Trinidad 2.0.0 一起使用。单击链接会产生 ViewExpiredException。

问题可能与以下在 Tomcat 7 服务器启动期间出现的堆栈跟踪有关。

2014 年 3 月 11 日下午 5:31:26 org.apache.catalina.session.StandardManager doLoad 严重:加载持久会话时出现 IOException:java.io.InvalidObjectException:类 javax.faces.component.UIViewRoot$PropertyKeys 中不存在枚举常量 resourceDependencyUniqueIdCounter java.io.InvalidObjectException:类 javax.faces.component.UIViewRoot$PropertyKeys 中不存在枚举常量 resourceDependencyUniqueIdCounter 在 java.io.ObjectInputStream.readEnum(ObjectInputStream.java:1741) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1345) 在 java.io.ObjectInputStream.readArray(ObjectInputStream.java:1704) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1342) 在 java.io.ObjectInputStream.readArray(ObjectInputStream.java:1704) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1342) 在 java.io.ObjectInputStream.readArray(ObjectInputStream.java:1704) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1342) 在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) 在 java.util.HashMap.readObject(HashMap.java:1155) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017) 在 java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1891) 在 java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1796) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1348) 在 java.io.ObjectInputStream.readArray(ObjectInputStream.java:1704) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1342) 在 java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1989) 在 java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1913) 在 java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1796) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1348) 在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) 在 org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1595) 在 org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1060) 在 org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:282) 在 org.apache.catalina.session.StandardManager.load(StandardManager.java:202) 在 org.apache.catalina.session.StandardManager.startInternal(StandardManager.java:489) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5476) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 在 org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) 在 org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) 在 org.apache.catalina.core.StandardHost.addChild(StandardHost.java:632) 在 org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1073) 在 org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1857) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 在 java.util.concurrent.FutureTask.run(FutureTask.java:166) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang.Thread.run(Thread.java:724) 引起:java.lang.IllegalArgumentException:没有枚举常量 javax.faces.component.UIViewRoot.PropertyKeys.resourceDependencyUniqueIdCounter 在 java.lang.Enum.valueOf(Enum.java:236) 在 java.io.ObjectInputStream.readEnum(ObjectInputStream.java:1739) ... 43 更多

2014 年 3 月 11 日下午 5:31:26 org.apache.catalina.session.StandardManager startInternal 严重:来自持久存储的异常加载会话 java.io.InvalidObjectException:类 javax.faces.component.UIViewRoot$PropertyKeys 中不存在枚举常量 resourceDependencyUniqueIdCounter 在 java.io.ObjectInputStream.readEnum(ObjectInputStream.java:1741) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1345) 在 java.io.ObjectInputStream.readArray(ObjectInputStream.java:1704) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1342) 在 java.io.ObjectInputStream.readArray(ObjectInputStream.java:1704) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1342) 在 java.io.ObjectInputStream.readArray(ObjectInputStream.java:1704) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1342) 在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) 在 java.util.HashMap.readObject(HashMap.java:1155) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017) 在 java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1891) 在 java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1796) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1348) 在 java.io.ObjectInputStream.readArray(ObjectInputStream.java:1704) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1342) 在 java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1989) 在 java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1913) 在 java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1796) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1348) 在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) 在 org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1595) 在 org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1060) 在 org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:282) 在 org.apache.catalina.session.StandardManager.load(StandardManager.java:202) 在 org.apache.catalina.session.StandardManager.startInternal(StandardManager.java:489) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5476) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 在 org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) 在 org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) 在 org.apache.catalina.core.StandardHost.addChild(StandardHost.java:632) 在 org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1073) 在 org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1857) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 在 java.util.concurrent.FutureTask.run(FutureTask.java:166) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang.Thread.run(Thread.java:724) 引起:java.lang.IllegalArgumentException:没有枚举常量 javax.faces.component.UIViewRoot.PropertyKeys.resourceDependencyUniqueIdCounter 在 java.lang.Enum.valueOf(Enum.java:236) 在 java.io.ObjectInputStream.readEnum(ObjectInputStream.java:1739) ... 43 更多

2014 年 3 月 11 日下午 5:31:26 org.apache.catalina.startup.HostConfig deployWAR

【问题讨论】:

对此的补充说明。如果我将 javax.faces.STATE_SAVING_METHOD 参数设置为“客户端”。该应用程序运行正常。 【参考方案1】:

Tomcat 尝试反序列化现有会话,但无法这样做,因为序列化字节流引用了它无法找到的枚举 (resourceDependencyUniqueIdCounter)。

我猜你要么更新了 Tomcat(保留旧的序列化会话),要么你仍在大量更改类而不更改类中的序列号。

此时最简单的解决方案是最有可能清除现有的序列化会话文件并重试。

【讨论】:

感谢您的意见。据我了解,我需要做的是在 C:\apache-tomcat-7.0.52\work\Catalina\localhost\\ 文件夹中找到 .SER 文件。此文件夹不包含任何文件。此外,这是与以前的 Tomcat 6 安装不同的安装位置。

以上是关于从 Tomcat 6 JDK 1.6 迁移到 Tomcat 7 JDK 1.7 会话问题的主要内容,如果未能解决你的问题,请参考以下文章

将应用程序从websphere迁移到tomcat

从 Django 1.6 升级到 1.9:python manage.py migrate 失败

Django 1.6 到 1.11 Admin.py 迁移

如何从Rancher 1.6迁移到Rancher 2.0?这份清单可以帮助你!

从 Django 1.6 (with south) 升级到 1.8 不会修改用户表上的“last_login”

将 Spring Web App 从 tomcat 5.5 迁移到 tomcat 6.0 的问题