4

我正在开发一个单页 jQuery 和 Backbone.js 网络应用程序。后端是 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 会话基础架构,而不必重新发明轮子。

4

2 回答 2

4

在您存储的初始 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 插件来 ajaxify 表单,这应该不是一个大问题)。

如果您熟悉 Java EE 的 MVC 框架JSF,那么了解其@ViewScoped注解的工作方式与上述大致相同可能会很有用。另请参阅 ao如何选择正确的 bean 范围?

于 2012-11-08T15:52:45.917 回答
0

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

会话在选项卡之间共享

于 2012-11-08T15:58:18.607 回答