我有一个Java Web应用程序,它在会话中存储一些数据。会话中的数据会随着用户与应用程序的交互而发生变化(例如,流程由控制器管理,每个控制器具有多个表单页面,在每个表单页面上,会话中的某些数据都会更新,流程会转到下一个表单页面)。
问题在于某些用户向应用程序打开了多个选项卡,每个选项卡在流程中都有不同的步骤。此时,由于选项卡共享同一会话(应用程序使用Cookie托管的会话),因此会话中的数据混乱了。
告诉用户使用不同的浏览器来避免共享相同的会话ID(例如,一个Firefox窗口和一个IE窗口)不是一种选择,因为肯定会在某个时刻有人忘记这样做,而是使用选项卡,从而弄乱了他们的数据。
添加一些验证来检测是否从另一个选项卡请求了另一个流,并向用户显示一条消息,表明不允许这样做,这不是一种选择,因为它会激怒用户,我们不希望这样做吗?:D
事实是,使用另一个选项卡对用户很有用,因为他们在使用应用程序方面的效率更高,因此我保留此选项。但是现在的问题是, 如何最好地管理更多标签的一个会话数据?
我想到的是让控制器在启动流程时生成一个令牌,并将该令牌传递到每个表单页面,然后依次将其发送回以标识自己。如果存在正在进行的流时,如果另一个选项卡请求相同的控制器操作,则生成另一个令牌并将其传递。
基本上,我希望每个流都具有一个令牌,并且在会话内,我不仅要保留一组数据,还要为每个令牌拥有一组数据,然后根据令牌匹配请求。
现在的问题是,这种方法将需要对应用程序进行大量重写,我想知道是否存在管理这种情况的最佳实践,或者有人可以建议其他方法。我愿意接受想法。
您遇到这种情况了吗?你是怎么处理的呢?
通常,这是通过为每个标签/窗口分配一个windowId并将其传递给每个请求来完成的。Jsf通过Orchestra支持这一点。Spring mvc在下一版本中将支持它。
最近,我需要一个简单的案例,因此我自己实现了它。花了半个小时。但是,我的范围非常有限:
windowId
Map<String, Object>