在一个浏览器中有两个基于servlet引擎cookie的会话的问题

时间:2010-06-04 03:34:28

标签: java session browser cookies

最近我们在Tomcat托管的Java Web应用程序中遇到了会话问题。

有时,我们的用户共享一台计算机和浏览器,以便使用网络应用。 Web应用程序使用基于cookie的会话。

Web应用程序的页面具有相同的HTML表单,但每个用户都有特定的数据。

让我们假设User1通过身份验证并使用特定于他的数据加载此表单。然后他做了一些更改并忘记提交它,让页面打开。在此之后,另一个User2访问具有相同浏览器的相同页面并获得具有特定于他的数据的表单。他还在形式上做了一些改变并提交了。 Web应用程序有什么作用?它获取User2提交的User2数据。一切都是正确的。但是,User1返回计算机并提交未提交的表单,其中包含特定于他的数据。 Web应用程序有什么作用?它获取特定于User2下提交的User1的修改数据。这是我们遇到的问题。

Servlet引擎考虑再次从User2请求。我们使用基于cookie的会话来获得简单的URL而没有像“jsessionid = abcdef”这样的附加参数。因此,当User1提交表单时,Web应用程序会获取当前User2会话的cookie。

以下是插图:

  1. 用户1访问 - >获取cookie1和data1 - >离开电脑
  2. User2访问 - >获取cookie2和data2 - >提交data2 - >网络应用获取cookie2和data2 - > data2来自User2 - 正确
  3. User1返回 - >提交数据1 - >网络应用获取cookie2和data1 - > data1来自User2 - > 错误
  4. 有人遇到过同样的问题吗?有什么解决方案吗?此问题已在Google Chrome中识别出来,但我认为其他浏览器的行为方式相同。

2 个答案:

答案 0 :(得分:0)

有很多方法可以解决这个问题。我们使用以下两个,

  1. 在所有表单中,添加一个带有用户ID的隐藏字段。当用户提交表单时,您可以检查会话是否仍为同一用户。

  2. 为防止XSRF攻击,我们在与会话关联的隐藏字段中添加特殊ID。会话更改后,我们可以立即检测到。

答案 1 :(得分:0)

当您收到特定用户的数据提交时,请检查此数据是否实际上是当前正在进行会话的用户。

因此,在会话对象本身中,您将要存储对当前登录用户的引用,并且您必须有办法将表单提交/其中包含的数据绑定到用户它属于。