4

确保特定页面(假设是单页 Web 应用程序)仅在一个浏览器选项卡中打开的最佳方法是什么?

假设 Java Web 应用程序具有身份验证,即用户必须登录(因此我们可以通过 Java Session API 识别哪个用户正在查看哪个页面)。

目的是,如果为同一 URL 打开另一个选项卡,用户将被重定向到一个静态页面,告诉他他在其他地方打开了应用程序(另一个选项卡)。

我当前的方法不适用于同一浏览器中的选项卡,因为JSESSIONID它存储在 cookie 中,可用于所有浏览器的选项卡。

4

2 回答 2

6

我假设您当前的用例是这样的:

  1. 用户打开浏览器选项卡,加载您的应用程序页面并登录。

然后用户打开第二个浏览器选项卡,加载您的应用程序页面并已登录(因为浏览器对所有选项卡或窗口都有相同的会话 cookie)。

并且您想限制用户,以便当他们加载第二个选项卡时,会看到一条警告消息:您已在其他地方登录此站点,请使用该窗口,或者如果您不再打开该窗口,请单击在这里注销并重新登录。

大多数解决方案将涉及为应用程序实例与会话一起保留一次性令牌。如果您的应用程序在单个页面中加载并向用户显示登录框,那么当用户登录时,您可以发送一次性令牌,将其存储在 javascript 变量中并与所有服务器请求一起发送。如果用户随后在新选项卡中加载应用程序,他们会请求他们的初始数据,并且服务器可以生成一个响应,说明令牌不存在并且他们需要注销、关闭窗口或切换到已经登录的窗口。

所以答案基本上是你想在服务器上的会话中存储一个随机字符串,在登录时将其提供给用户,并检查每个请求是否都有它,否则会将它们反弹到注销页面。在 Web 客户端的 javascript 中,存储该令牌并将其与每个请求一起发送到服务器。

于 2012-10-31T00:24:49.573 回答
1

您可以创建对后端的异步调用(关键字:长时间轮询)并通过它发送单个字节以使其保持活动状态。只要它还活着,标签就会打开。如果有第二个电话打进来,您可以对此进行测试。

于 2012-07-25T15:14:13.650 回答