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

Java:确保web应用程序仅在一个浏览器选项卡中打开,java,session,servlets,servlet-filters,Java,Session,Servlets,Servlet Filters,确保特定页面(假设一个单页Web应用程序)仅在一个浏览器选项卡中打开的最佳方法是什么 假设Java Web应用程序具有身份验证,即用户必须登录(因此我们可以通过Java会话API确定哪个用户正在查看哪个页面) 这样做的目的是,如果为同一URL打开了另一个选项卡,用户将被重定向到一个静态页面,该页面告诉用户他在其他地方打开了应用程序(另一个选项卡) 我当前的方法无法用于同一浏览器中的选项卡,因为JSESSIONID存储在cookie中,可用于所有浏览器的选项卡。您可以创建对后端的异步调用(关键字:

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

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

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


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

您可以创建对后端的异步调用(关键字:长时间轮询),并通过它发送单个字节以保持其活动状态。只要该选项卡处于活动状态,它就处于打开状态。如果有第二个调用,您可以对此进行测试。

我假设您当前的用例是:

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

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

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


    因此,答案很可能是,您希望在服务器上的会话中存储一个随机字符串,在登录时将其提供给用户,并检查每个请求是否都包含该字符串,否则会将它们反弹到注销页面。在web客户端的javascript中,存储该令牌,并将其与每个请求一起发送到服务器。

    我有一个单页应用程序,“富客户端”。我需要将其限制为仅在一个选项卡中打开,因为在不同的选项卡中打开会导致更复杂。让我猜猜,当两个浏览器打开你的应用程序时,你共享了导致问题的会话?@ChinBoon这是看待此问题的另一种方式。解决此问题的另一种方式是使用PhaseListener并记录当前页面,然后如果用户在另一个页面上,则将其发送到该页面。这样一来,每个标签页都会被强制放在同一个页面上,同时也会禁用浏览器导航(这正是我使用它的主要目的)。@Stefan:你是如何得出OP使用JSF的结论的?在整个问题中没有任何迹象表明OP正在使用JSF,更不用说OP的后期历史了。为什么要投反对票?这可能不是一个“好”的解决方案,但它解决了问题。我没有否决你的解决方案,其他人否决了,并且应该证明为什么。因为,正如你所说,这不是一个优雅的方法(它可能会引起其他问题),我将尝试它只是作为最后的手段。现在我还在寻找。