Java 如何存储单个浏览器选项卡/窗口的状态?
我正在开发一个单页jQuery&Backbone.js web应用程序。后端是JBoss6应用服务器 到目前为止,我们的结构如下:Java 如何存储单个浏览器选项卡/窗口的状态?,java,servlets,Java,Servlets,我正在开发一个单页jQuery&Backbone.js web应用程序。后端是JBoss6应用服务器 到目前为止,我们的结构如下: 只有一个servlet(前端控制器)。来自JavaScript客户端的每个请求都在这里通过 在servlet中——在某个JS客户机的第一个请求中——我查看了一个有状态会话bean。对于该客户机的下一个请求,我将查找结果存储在HTTP会话容器中。因此,每个JS客户机只有一个有状态会话bean。此连接由会话cookie保持 现在我有一个额外的要求: 当用户有两个浏览
- 只有一个servlet(前端控制器)。来自JavaScript客户端的每个请求都在这里通过李>
- 在servlet中——在某个JS客户机的第一个请求中——我查看了一个有状态会话bean。对于该客户机的下一个请求,我将查找结果存储在HTTP会话容器中。因此,每个JS客户机只有一个有状态会话bean。此连接由会话cookie保持李>
- servlet必须为某个JS客户端的第一个请求生成一个新的会话ID。此会话ID被传送到客户端李>
- 每次发布到后端,JS客户端都必须发送此会话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进行编码。它与您的解决方案类似,但不是隐藏的输入值。请参见此处:[链接]。