管理多个选项卡的 webapp 会话数据/控制器流
Posted
技术标签:
【中文标题】管理多个选项卡的 webapp 会话数据/控制器流【英文标题】:Managing webapp session data/controller flow for multiple tabs 【发布时间】:2011-05-27 16:06:22 【问题描述】:我有一个 Java Web 应用程序,它在会话中存储一些数据。会话中的数据随着用户与应用程序的交互而变化(例如,流程由控制器管理,每个控制器有多个表单页面,在每个表单页面上,会话中的一些数据会更新,流程会转到下一个表单页面)。
问题在于,一些用户向应用程序打开了多个选项卡,每个选项卡在流程中都有不同的步骤。此时会话中的数据混乱了,因为选项卡共享同一个会话(应用程序使用 cookie 管理的会话)。
告诉用户使用不同的浏览器来避免共享相同的会话 ID(例如一个 Firefox 窗口和一个 IE 窗口)不是一种选择,因为在某些时候肯定有人会忘记这样做,而是使用标签,从而搞砸了他们的数据。
添加一些验证来检测从另一个选项卡请求另一个流并向用户显示一条消息,说这是不允许的,这也不是一种选择,因为它惹恼了用户,我们不希望这样做吗? :D
事实上,使用另一个选项卡对用户很有用,因为他们使用应用程序的效率更高,所以我保留了这个选项。但现在的问题是如何最好地管理更多标签的一个会话数据?
我的想法是让控制器在启动流程时生成一个令牌,并将此令牌传递给每个表单页面,然后将其发送回以识别自己。如果另一个选项卡在正在进行的流程中请求相同的控制器操作,则生成另一个令牌并传递它。
基本上,我希望每个流都有一个令牌,并且在会话中我不会只保留一组数据,而是为每个令牌保存一组数据,然后根据令牌匹配请求。
现在的问题是,这种方法需要对应用程序进行大量重写,我想知道是否有管理这种情况的最佳实践,或者有人可以建议其他方法。我对想法持开放态度。
你遇到过这种情况吗?你是怎么处理的?
【问题讨论】:
使用单独的选项卡和单独的窗口没有区别。会话范围是浏览器范围,因为它是使用 cookie 实现的(大多数情况下)。您使用的是什么技术堆栈? JSP+servlet? JSF? @Matt Ball:我正在使用 Servlets+JSP。我已经更新了我的问题。我知道会话跨越整个浏览器,这就是为什么我提到两个窗口是一个 IE 另一个 Firefox。 好吧,当你真正的意思是“使用不同的浏览器”时,这就是 “使用不同的窗口而不是选项卡以避免共享相同的会话 ID” 的措辞。 【参考方案1】:这通常是通过为每个选项卡/窗口分配一个 windowId 并在每个请求上传递它来完成的。 Jsf 通过orchestra 支持这一点。 Spring mvc会在下个版本支持。
我最近需要一个简单的案例,所以我自己实现了它。花了半个小时。但是,我的范围非常有限:
为每个请求传递一个windowId
,并将其返回给下一个请求。第一次 - 生成它。
对于您想要存储在会话中的任何属性,放置一个Map<String, Object>
,其中键是windowId
【讨论】:
感谢您的回答。这是你指的吗? myfaces.apache.org/orchestra/myfaces-orchestra-core/… 是的。而已。我已经使用它并且它运行顺利。但它需要春天。 您从哪里得到 Spring MVC 将很快处理对话的印象? AFAIK 这不是计划的。 Spring Webflow 是围绕对话/流概念构建的。对话是可选的并行对话(窗口),流允许通过实现版本化数据存储来处理浏览器来回处理。 @fforw 来自 Juergen Hoeller 12 月的演讲。但是,它可能已被删除。 如何在不更改 url 的情况下通过每个请求传递该 windowId?例如在获取请求中。【参考方案2】:这正是 Seam 的创建目的。在 Seam 中有一个名为 Conversation 的概念,它基本上完全符合您的解释。对话基本上是一种将 Session 分成许多部分的方法,这些部分可以在某个超时时到期。您可以查看 org.jboss.seam.core.Manager 类的源代码,了解它是如何实际实现的并获得启发;)
【讨论】:
【参考方案3】:根据应用程序的复杂性,您可能需要研究在应用程序中实现选项卡。这使您可以全面控制流程,同时仍为用户提供他们想要的功能。我认为这是最可靠的解决方案,因为您不会依赖浏览器处理会话的方式,从而最大限度地减少“已知未知数”的数量。
当然,这可能会产生很大的前期成本,具体取决于您的应用程序的结构。如果没有关于您的应用的更多信息,您是最适合做决定的人。
【讨论】:
我(必须)使用一个产品来尝试做一个版本。它通常不会有好的结局。用户仍然希望使用标准的浏览器导航,并且您无法阻止他们打开新标签并希望获得最好的结果。我确信在这方面可以做得比我经历过的更好,但我怀疑这微不足道。【参考方案4】:您也可以尝试将您的应用程序包装在 Adobe Air 中
然后将您的 Web 应用程序限制为只能从空中访问。通过这样做,您无需考虑 Web 浏览器碎片及其独特的行为。
【讨论】:
以上是关于管理多个选项卡的 webapp 会话数据/控制器流的主要内容,如果未能解决你的问题,请参考以下文章