当前位置: 首页 > 面试题库 >

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

贺跃
2023-03-14
问题内容

我正在开发一个单页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会话基础结构,而不必重新发明轮子。


问题答案:

在您存储的初始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作用域?



 类似资料:
  • 问题内容: 在同一浏览器的选项卡/窗口之间进行JavaScript通信的最可靠方法是什么?例如,当选项卡2开始播放音频时,选项卡1以某种方式知道这一点并可以暂停其播放器。 我正在建立一个带有音乐播放器的网站…因此,如果您现在打开该网站的两个标签,则可以同时在两者上播放音乐。这显然是不好的,所以我正在尝试寻找解决方案。 有任何想法吗?谢谢 问题答案: 这是一个旧的答案,我建议使用此处描述的现代版本:

  • 问题内容: 背景:我正在做一些用户界面测试,这些测试需要检测人们是否在关注。 具体来说,我想知道如果当前的选项卡处于非活动状态,或者浏览器窗口处于非活动状态,那么在不同的浏览器中,我的Javascript代码将受到什么影响。到目前为止,我已经挖掘了以下内容: 我有以下问题: 除了移动浏览器以外,当选项卡处于非活动状态时,桌面浏览器是否会暂停JS执行?什么时候使用哪些浏览器? 哪些浏览器减少重复次数

  • 我对python很陌生,所以我是一个新手,我尝试过搜索,但似乎没有什么效果(至少我看到和测试过)。我还尝试了“webbrowser.get(chrome_path).open(url)”,但这并没有真正帮助我

  • 问题内容: 我尝试使用以下代码在关闭浏览器窗口时收到警报: 它可以工作,但是如果页面包含一个超链接,则单击该超链接会引发相同的警报。仅在关闭浏览器窗口时才需要显示警报,而在单击超链接时则不需要。 问题答案: 保持您的代码不变,并使用jQuery处理链接:

  • 问题内容: 我遇到的情况是,单击按钮打开带有搜索结果的新浏览器窗口。 有什么方法可以连接并聚焦到新打开的浏览器窗口吗? 并使用它,然后返回到原始(第一个)窗口。 问题答案: 您可以在以下窗口之间切换:

  • 我第一次使用JSON Web令牌(JWT)。我正在制作一个节点。js应用程序。我想使用JWT进行身份验证。根据文档,我将JSON令牌返回到前端。 但是我不知道如何将这个JSON令牌保存到我的浏览器头中,这样它就不会丢失,并随头一起再次发送到后端。如何将它保存在我的浏览器存储中,并在每次向后端发送请求时将其添加到请求头中?