我正在开发一个单页jQuery&Backbone.js Web应用程序。后端是JBoss 6应用服务器。
到目前为止,我们具有以下结构:
现在,我还有一个附加要求:
当用户有两个浏览器选项卡(在一个浏览器中)时,他们应在每个浏览器选项卡中具有两个独立的Web应用程序实例。因此,会话cookie存在问题,因为此会话cookie适用于所有浏览器选项卡。
我必须更改结构,以便:
我的问题是:
到目前为止,我将查找结果保存在HTTP Session对象中,而且我还没有考虑过生成会话ID。但是现在我必须将其存储在其他地方,在哪里?
有没有人经历过这种设置,可以为我提供帮助吗?
更新: 感谢BalusC的这种非常有趣的方法。 当我对您的了解很好时,这意味着:
一个 浏览器的选项卡的所有单个JS客户端共享一个HTTP会话对象。在此HTTP会话对象中,每个选项卡都有其自己的入口点。听起来真的很好。因此,我仍然可以使用整个HTTP会话基础结构,而不必重新发明轮子。
在您存储的初始GET请求上自动生成一个唯一值,并将其作为隐藏的输入值传递给每个后续回发。使用此唯一值作为代表视野范围数据的会话属性的标识符。
在全新会话的第一个请求中,请执行以下操作:
Map<String, ViewData> viewScope = new HashMap<String, ViewData>(); session.setAttribute("viewScope", viewScope);
(ViewData代表您要在同一视图上的回溯中跟踪的特定于视图的数据)
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化,那么这应该不是一个大问题)。
$(form).serialize()
如果您熟悉JavaEE的MVC框架JSF,那么了解其@ViewScoped注释与上述大致相同可能会很有用。另请参见ao 如何选择正确的bean作用域?
@ViewScoped