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