Java 如何存储单个浏览器选项卡/窗口的状态?

Java 如何存储单个浏览器选项卡/窗口的状态?,java,servlets,Java,Servlets,我正在开发一个单页jQuery&Backbone.js web应用程序。后端是JBoss6应用服务器 到目前为止,我们的结构如下: 只有一个servlet(前端控制器)。来自JavaScript客户端的每个请求都在这里通过 在servlet中——在某个JS客户机的第一个请求中——我查看了一个有状态会话bean。对于该客户机的下一个请求,我将查找结果存储在HTTP会话容器中。因此,每个JS客户机只有一个有状态会话bean。此连接由会话cookie保持 现在我有一个额外的要求: 当用户有两个浏览

我正在开发一个单页jQuery&Backbone.js web应用程序。后端是JBoss6应用服务器

到目前为止,我们的结构如下:

  • 只有一个servlet(前端控制器)。来自JavaScript客户端的每个请求都在这里通过
  • 在servlet中——在某个JS客户机的第一个请求中——我查看了一个有状态会话bean。对于该客户机的下一个请求,我将查找结果存储在HTTP会话容器中。因此,每个JS客户机只有一个有状态会话bean。此连接由会话cookie保持
现在我有一个额外的要求:

当用户有两个浏览器选项卡(在一个浏览器中)时,每个浏览器选项卡中都应该有两个独立的web应用实例。因此,我对会话cookie有问题,因为此会话cookie适用于所有浏览器选项卡

我必须改变结构,以便:

  • servlet必须为某个JS客户端的第一个请求生成一个新的会话ID。此会话ID被传送到客户端
  • 每次发布到后端,JS客户端都必须发送此会话ID
我的问题是:

到目前为止,我将查找结果保存在HTTP会话对象中,我没有考虑生成会话ID。但现在我必须将其存储在其他地方,在哪里

有没有人有过这样的经历,可以帮我

更新:
感谢BalusC提供了这一非常有趣的方法。
当我很好地理解你时,这意味着:


一个浏览器选项卡的所有单独JS客户端共享一个HTTP会话对象。在这个HTTP会话对象中,每个选项卡都有自己的入口点。听起来真不错。因此,我仍然可以使用整个HTTP会话基础结构,而不必重新发明轮子。

在初始GET请求上自动生成一个唯一值,您可以将该值作为隐藏输入值存储并在每次后续回发时传递。使用此唯一值作为表示视图范围数据的会话属性的标识符

在全新会话的第一次请求期间,执行以下操作:

Map<String, ViewData> viewScope = new HashMap<String, ViewData>();
session.setAttribute("viewScope", viewScope);
在生成HTML时,请执行以下操作:


在每次POST请求期间,请执行以下操作:

String viewDataId = UUID.randomUUID().toString();
viewScope.put(viewDataId, new ViewData());
request.setAttribute("viewDataId", viewDataId);
ViewData viewData = viewScope.get(request.getParameter("viewDataId"));
// Get/set view-specific data in there.
确保jQuery也传递这个隐藏的输入(如果您已经正确地使用了
$(form).serialize()
,或者使用AjaxForm插件来ajaxify表单,这应该不是什么大问题)


如果您熟悉JavaEE的MVC框架,那么知道它的
@ViewScoped
注释的工作原理与上面描述的大致相同可能会很有用。另请参见a.o.

您可以将会话跟踪与URL重写结合使用。请看这里:


我相信您不了解会话跟踪在客户端实际上是如何工作的。用这种方式无法为每个浏览器窗口/选项卡创建单独的会话。为什么不可以?每个选项卡都可以有自己的会话id作为URL中的GET参数,如下所示:http:\\www.myapp.com?会话id=02393vdr8t。ID由Web服务器处理,但必须对每个URL进行编码。它与您的解决方案类似,但不是隐藏的输入值。请参见此处:[链接]。