Java:确保Web应用程序仅在一个浏览器选项卡中打开

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

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

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

我目前的方法无法在同一浏览器中使用标签,因为JSESSIONID存储在cookie中,可用于所有浏览器的标签。

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

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

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

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

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

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

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