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

时间:2012-07-25 15:08:21

标签: java session servlets servlet-filters

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

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

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

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

2 个答案:

答案 0 :(得分:6)

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

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

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

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

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

答案 1 :(得分:1)

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