tomcat中session持久化的问题

简单生活FF 2017-09-11 04:29:35
两个非常简单的web应用部署到tomcat中,采用在conf/Catalina/localhost 目录下配置xml的方式部署。

采用filestore方式将session持久化到文件夹。

但是,如果两个应用的持久化filestore目录设置为同一个文件夹,则在session持久化时会抛出java.lang.ClassNotFoundException异常。(session中放入了一个类对象,该类已经实现了Serializable接口,两个应用均这么做了)

web程序就是最最简单的程序,用于测试这个问题


应用1部署xml文件:

<Context path="/SessionPersistTest01" docBase="C:\Users\dell\Desktop\projects\SessionPersistTest01" >
<Manager className="org.apache.catalina.session.PersistentManager"
saveOnRestart="true"
maxActiveSessions="20"
maxIdleBackup="30"
maxIdleSwap="40">
<Store className="org.apache.catalina.session.FileStore" directory="C:\Users\dell\Desktop\sessions" />
</Manager>
</Context>


应用1部署xml文件:

<Context path="/SessionPersistTest02" docBase="C:\Users\dell\Desktop\projects\SessionPersistTest02" >
<Manager className="org.apache.catalina.session.PersistentManager"
saveOnRestart="true"
maxActiveSessions="20"
maxIdleBackup="30"
maxIdleSwap="40">
<Store className="org.apache.catalina.session.FileStore" directory="C:\Users\dell\Desktop\sessions" />
</Manager>
</Context>


上述两个应用的<Store >的directory目录相同情况下,会抛出java.lang.ClassNotFoundException。
如果持久化目录不同,不会有异常。
请问这是为什么?是tomcat的一种机制。

附异常:

11-Sep-2017 16:05:52.773 SEVERE [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.session.StoreBase.processExpires Session: A12657F3C4B23D11EA24C4FA3A55E394;
java.lang.ClassNotFoundException: cn.gxf.test.Person2
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1332)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1166)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.apache.catalina.util.CustomObjectInputStream.resolveClass(CustomObjectInputStream.java:74)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at org.apache.catalina.session.StandardSession.doReadObject(StandardSession.java:1634)
at org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1099)
at org.apache.catalina.session.FileStore.load(FileStore.java:266)
at org.apache.catalina.session.StoreBase.processExpires(StoreBase.java:144)
at org.apache.catalina.session.PersistentManagerBase.processExpires(PersistentManagerBase.java:428)
at org.apache.catalina.session.ManagerBase.backgroundProcess(ManagerBase.java:555)
at org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:5537)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1377)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1349)
at java.lang.Thread.run(Thread.java:745)
...全文
583 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
简单生活FF 2017-09-15
  • 打赏
  • 举报
回复
引用 2 楼 u011619071 的回复:
尝试使用同一个package下的person对象。
不是同一个Person的问题。测试出来即使是两个不同类钝化到同一个目录也有问题。
简单生活FF 2017-09-15
  • 打赏
  • 举报
回复
引用 4 楼 u011619071 的回复:
[quote=引用 3 楼 gxf1027 的回复:] [quote=引用 2 楼 u011619071 的回复:] 尝试使用同一个package下的person对象。
本来就是两个独立的应用,不应该应用同一个包的person吧[/quote]
引用 3 楼 gxf1027 的回复:
[quote=引用 2 楼 u011619071 的回复:] 尝试使用同一个package下的person对象。
本来就是两个独立的应用,不应该应用同一个包的person吧[/quote] 序列化与反序列化 规范要求路径必须一致。[/quote] 我的问题是两个应用使用同一个目录作为钝化和活化的filestore为什么有问题?这是规范要求的吗?
X元素 2017-09-14
  • 打赏
  • 举报
回复
引用 3 楼 gxf1027 的回复:
[quote=引用 2 楼 u011619071 的回复:] 尝试使用同一个package下的person对象。
本来就是两个独立的应用,不应该应用同一个包的person吧[/quote]
引用 3 楼 gxf1027 的回复:
[quote=引用 2 楼 u011619071 的回复:] 尝试使用同一个package下的person对象。
本来就是两个独立的应用,不应该应用同一个包的person吧[/quote] 序列化与反序列化 规范要求路径必须一致。
简单生活FF 2017-09-14
  • 打赏
  • 举报
回复
引用 2 楼 u011619071 的回复:
尝试使用同一个package下的person对象。
本来就是两个独立的应用,不应该应用同一个包的person吧
X元素 2017-09-13
  • 打赏
  • 举报
回复
尝试使用同一个package下的person对象。
简单生活FF 2017-09-13
  • 打赏
  • 举报
回复
求助啊求助啊

81,090

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧