【问题标题】:Can a serialization problem in tomcat mix up user sessions?tomcat 中的序列化问题会混淆用户会话吗?
【发布时间】: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


【解决方案1】:

感谢您的回复和cmets。

我发现我的问题是我的登录服务中的一个错误(根据我在网上找到的情况,最有可能发生这种情况)。

登录服务有一个实例变量,其中包含即将登录的用户信息,并且由于 Spring 配置,该服务是单例的。每当两个用户试图同时登录时,就会发生会话混淆。

【讨论】:

    猜你喜欢
    • 2019-09-13
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2013-04-12
    • 2015-11-25
    • 2013-09-09
    相关资源
    最近更新 更多