小编典典

如何存储单个浏览器标签/窗口的状态?

java

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

到目前为止,我们具有以下结构:

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

现在,我还有一个附加要求:

当用户有两个浏览器选项卡(在一个浏览器中)时,他们应在每个浏览器选项卡中具有两个独立的Web应用程序实例。因此,会话cookie存在问题,因为此会话cookie适用于所有浏览器选项卡。

我必须更改结构,以便:

  • Servlet必须为某个JS客户端的第一个请求生成一个新的会话ID。该会话ID被传达给客户端。
  • 每次向后端发送POST时,JS客户端都必须发送该会话ID。

我的问题是:

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

有没有人经历过这种设置,可以为我提供帮助吗?

更新:
感谢BalusC的这种非常有趣的方法。
当我对您的了解很好时,这意味着:

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


阅读 178

收藏
2020-09-28

共1个答案

小编典典

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

在全新会话的第一个请求中,请执行以下操作:

Map<String, ViewData> viewScope = new HashMap<String, ViewData>();
session.setAttribute("viewScope", viewScope);

ViewData代表您要在同一视图上的回溯中跟踪的特定于视图的数据)

在每个GET请求期间,请执行以下操作:

String viewDataId = UUID.randomUUID().toString();
viewScope.put(viewDataId, new ViewData());
request.setAttribute("viewDataId", viewDataId);

在生成HTML的过程中,请执行以下操作:

<input type="hidden" name="viewDataId" value="${viewDataId}" />

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

ViewData viewData = viewScope.get(request.getParameter("viewDataId"));
// Get/set view-specific data in there.

确保jQuery还会传递此隐藏的输入(如果您已经正确使用$(form).serialize()或例如AjaxForm插件来对表单进行Ajax化,那么这应该不是一个大问题)。

如果您熟悉JavaEE的MVC框架JSF,那么了解其@ViewScoped注释与上述大致相同可能会很有用。另请参见ao
如何选择正确的bean作用域?

2020-09-28