最近我们在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。
以下是插图:
有人遇到过同样的问题吗?有什么解决方案吗?此问题已在Google Chrome中识别出来,但我认为其他浏览器的行为方式相同。
答案 0 :(得分:0)
有很多方法可以解决这个问题。我们使用以下两个,
在所有表单中,添加一个带有用户ID的隐藏字段。当用户提交表单时,您可以检查会话是否仍为同一用户。
为防止XSRF攻击,我们在与会话关联的隐藏字段中添加特殊ID。会话更改后,我们可以立即检测到。
答案 1 :(得分:0)
当您收到特定用户的数据提交时,请检查此数据是否实际上是当前正在进行会话的用户。
因此,在会话对象本身中,您将要存储对当前登录用户的引用,并且您必须有办法将表单提交/其中包含的数据绑定到用户它属于。