【发布时间】:2011-05-27 16:06:22
【问题描述】:
我有一个 Java Web 应用程序,它在会话中存储一些数据。会话中的数据随着用户与应用程序的交互而变化(例如,流程由控制器管理,每个控制器有多个表单页面,在每个表单页面上,会话中的一些数据会更新,流程会转到下一个表单页面)。
问题在于,一些用户向应用程序打开了多个选项卡,每个选项卡在流程中都有不同的步骤。此时会话中的数据混乱了,因为选项卡共享同一个会话(应用程序使用 cookie 管理的会话)。
告诉用户使用不同的浏览器来避免共享相同的会话 ID(例如一个 Firefox 窗口和一个 IE 窗口)不是一种选择,因为在某些时候肯定有人会忘记这样做,而是使用标签,从而搞砸了他们的数据。
添加一些验证来检测从另一个选项卡请求另一个流并向用户显示一条消息,说这是不允许的,这也不是一种选择,因为它惹恼了用户,我们不希望这样做吗? :D
事实上,使用另一个选项卡对用户很有用,因为他们使用应用程序的效率更高,所以我保留了这个选项。但现在的问题是如何最好地管理多个标签的一个会话数据?
我的想法是让控制器在启动流程时生成一个令牌,并将此令牌传递给每个表单页面,然后将其发送回以识别自己。如果另一个选项卡在正在进行的流程中请求相同的控制器操作,则生成另一个令牌并传递它。
基本上,我希望每个流都有一个令牌,并且在会话中我不会只保留一组数据,而是为每个令牌保存一组数据,然后根据令牌匹配请求。
现在的问题是,这种方法需要对应用程序进行大量重写,我想知道是否有管理这种情况的最佳实践,或者有人可以建议其他方法。我对想法持开放态度。
你遇到过这种情况吗?你是怎么处理的?
【问题讨论】:
-
使用单独的选项卡和单独的窗口没有区别。会话范围是浏览器范围,因为它是使用 cookie 实现的(大多数情况下)。您使用的是什么技术堆栈? JSP+servlet? JSF?
-
@Matt Ball:我正在使用 Servlets+JSP。我已经更新了我的问题。我知道会话跨越整个浏览器,这就是为什么我提到两个窗口是一个 IE 另一个 Firefox。
-
好吧,当你真正的意思是“使用不同的浏览器”时,这就是 “使用不同的窗口而不是选项卡以避免共享相同的会话 ID” 的措辞。