【发布时间】:2019-08-19 22:02:00
【问题描述】:
我有一台今天强制重启的 Tomcat 7 服务器。重新启动后,用户的 HTTP 会话混淆了。
用户A反映刷新网页后,显示的是用户B的数据,而不是他自己的数据。这是一个严重的问题。
分析日志,发现Tomcat写HTTP会话属性有问题:
Aug 08, 2019 11:47:16 AM org.apache.catalina.session.StandardSession writeObject
WARNING: Cannot serialize session attribute MY_ATTRIBUTE for session 61504204C7A2904C981E2D37053138E6
java.io.NotSerializableException: com.example.model.MyClass
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
(...)
Aug 08, 2019 11:47:16 AM org.apache.catalina.session.StandardSession writeObject
WARNING: Cannot serialize session attribute KEY for session C76DE179F9EBC659A91FB68D63D6F7E9
java.io.NotSerializableException: com.example.model.OtherClass
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at java.util.LinkedList.writeObject(LinkedList.java:1131)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
(...)
这些会话属性是使用 Struts 2 管理的。
我还注意到用户 A 和用户 B 在失败/重新启动时都登录了系统。
我目前在 Tomcat 中禁用了会话持久性,但我希望您能阐明这个问题的根本原因。
即Tomcat混淆用户会话的原因是什么?实现 Serializable 接口会解决这个问题吗?我怎么能确定?
提前致谢。
【问题讨论】:
-
Tomcat 不应混淆您的会话,即使序列化某些属性值时出现错误。您是否使用容器管理的身份验证并且 Tomcat 是否会生成您的会话、cookie 等?您的应用程序如何确定向每个用户显示哪些“数据”?你能重现这个并显示数据在会话之间“移动”吗?或者一个客户端的会话可以以某种方式访问另一个用户的会话?
标签: java session tomcat serialization struts2