确保特定页面(假设是单页 Web 应用程序)仅在一个浏览器选项卡中打开的最佳方法是什么?
假设 Java Web 应用程序具有身份验证,即用户必须登录(因此我们可以通过 Java Session API 识别哪个用户正在查看哪个页面)。
目的是,如果为同一 URL 打开另一个选项卡,用户将被重定向到一个静态页面,告诉他他在其他地方打开了应用程序(另一个选项卡)。
我当前的方法不适用于同一浏览器中的选项卡,因为JSESSIONID
它存储在 cookie 中,可用于所有浏览器的选项卡。
确保特定页面(假设是单页 Web 应用程序)仅在一个浏览器选项卡中打开的最佳方法是什么?
假设 Java Web 应用程序具有身份验证,即用户必须登录(因此我们可以通过 Java Session API 识别哪个用户正在查看哪个页面)。
目的是,如果为同一 URL 打开另一个选项卡,用户将被重定向到一个静态页面,告诉他他在其他地方打开了应用程序(另一个选项卡)。
我当前的方法不适用于同一浏览器中的选项卡,因为JSESSIONID
它存储在 cookie 中,可用于所有浏览器的选项卡。
我假设您当前的用例是这样的:
然后用户打开第二个浏览器选项卡,加载您的应用程序页面并已登录(因为浏览器对所有选项卡或窗口都有相同的会话 cookie)。
并且您想限制用户,以便当他们加载第二个选项卡时,会看到一条警告消息:您已在其他地方登录此站点,请使用该窗口,或者如果您不再打开该窗口,请单击在这里注销并重新登录。
大多数解决方案将涉及为应用程序实例与会话一起保留一次性令牌。如果您的应用程序在单个页面中加载并向用户显示登录框,那么当用户登录时,您可以发送一次性令牌,将其存储在 javascript 变量中并与所有服务器请求一起发送。如果用户随后在新选项卡中加载应用程序,他们会请求他们的初始数据,并且服务器可以生成一个响应,说明令牌不存在并且他们需要注销、关闭窗口或切换到已经登录的窗口。
所以答案基本上是你想在服务器上的会话中存储一个随机字符串,在登录时将其提供给用户,并检查每个请求是否都有它,否则会将它们反弹到注销页面。在 Web 客户端的 javascript 中,存储该令牌并将其与每个请求一起发送到服务器。
您可以创建对后端的异步调用(关键字:长时间轮询)并通过它发送单个字节以使其保持活动状态。只要它还活着,标签就会打开。如果有第二个电话打进来,您可以对此进行测试。