【问题标题】:Tomcat - Prevent persistence of sessionsTomcat - 防止会话持久化
【发布时间】:2014-07-24 04:52:53
【问题描述】:

我在重新启动 tomcat 时收到 IOException。 我尝试了exception loading sessions from persistent storage中建议的各种解决方案

他们都没有解决问题。 我尝试在 context.xml 中取消注释 <Manager pathname=""/>。没有帮助。

建议的另一个解决方案是使类实现 Serialiable。我不想那样做。

我的目标是让 Tomcat 不保留这些会话。 我正在使用 Tomcat 7.0.54。

以下是堆栈跟踪。请帮忙。

`SEVERE: IOException while loading persisted sessions:
     java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException:     com.comp.cloud.portal.zCompHD
     java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: com.comp.cloud.portal.zCompHD
     at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1354)
     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
     at java.util.LinkedList.readObject(LinkedList.java:1136)
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
     at java.lang.reflect.Method.invoke(Method.java:606)
     at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)
     at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1893)
     at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
     at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
     at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)
     at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915)
     at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
     at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
     at java.util.HashMap.readObject(HashMap.java:1183)
     at sun.reflect.GeneratedMethodAccessor18.invoke(Unknown Source)
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
     at java.lang.reflect.Method.invoke(Method.java:606)
     at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)
     at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1893)
     at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
     at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
     at org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1619)
     at org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1084)
     at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:282)
     at org.apache.catalina.session.StandardManager.load(StandardManager.java:202)
     at org.apache.catalina.session.StandardManager.startInternal(StandardManager.java:489)
     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
     at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5476)
     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
     at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
     at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
     at java.util.concurrent.FutureTask.run(FutureTask.java:262)
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
     at java.lang.Thread.run(Thread.java:744)

【问题讨论】:

  • "... 如上所述,默认情况下,每个 Web 应用程序都配置了标准管理器实现,并在重新启动时执行会话持久性。要禁用此持久性功能,请为您的 Web 应用程序创建一个上下文配置文件并在那里添加以下元素:..." - 请参阅 tomcat.apache.org/tomcat-7.0-doc/config/…
  • @Leo :如上面的描述中所述,我尝试这样做。没有帮助。为此还能做些什么?
  • 无论如何——不管你现在是否想要会话持久化——将不可序列化的东西放到http会话中绝对是个坏主意。这可能表明应用程序设计不佳
  • 1) 随着项目的增长,您可能需要集群和会话复制,但您不能 - 您的会话不再可序列化 2) 可能您的不可序列化属性试图将某些东西注入多个使用那个东西的地方。考虑使用 DI 和各种设计模式以获得更好的可读性和便于未来重构。不可序列化的会话称为 J2EE 反模式。例如,请参阅此链接:cwe.mitre.org/data/definitions/579.html
  • Java Servlet 3.0 规范规定,在分布式环境中 (7.2.2) 容器必须接受实现 Serializable 接口的对象。容器可能会选择支持在 HttpSession 中存储其他指定对象,例如对 Enterprise JavaBeans 组件和事务的引用。 而一些框架如 Apache MyFaces 坚持序列化Sessions

标签: java session tomcat


【解决方案1】:

解决此问题的另一种方法是使用 Spring Session,它提供了一个替换 HttpSession 对象,可以以可配置的方式持久化。有多种持久化方法可用,例如Redis、JDBC 或内存中的 Map。默认情况下,他们(或至少其中一些)可能期望这些项目是可序列化的,但实现更加可定制,因此您可以设置一个序列化程序来剥离您的不可序列化对象并留下其余部分(例如)。

【讨论】:

    猜你喜欢
    • 2010-11-28
    • 2012-08-27
    • 2010-12-20
    • 2011-07-06
    • 2017-12-27
    • 2012-05-19
    • 1970-01-01
    • 2011-11-05
    相关资源
    最近更新 更多