标签页之间共享的会话

7
我有一个JAVA Web应用程序,我需要停止会话在浏览器选项卡之间共享,意思是:
用户打开浏览器,登录到他的帐户,并在同一浏览器中的新选项卡中打开特定页面。根据默认设置,会话被共享到新选项卡中,用户自动登录到新选项卡。有人能告诉我如何停止这个功能,这样我至少可以在一些敏感页面上限制这个功能,如果不能在整个应用程序中限制的话。

1
可能是如何区分浏览器选项卡中的会话?的重复问题。 - Vineet Reynolds
你的应用程序中是否使用了JavaScript? - developer
2个回答

11
通常情况下,cookie 用于处理会话。这样所有的选项卡和浏览器窗口都共享同一个会话。但是,您可以配置您的服务容器来使用 URL 重写而不是 cookie。(Jetty 的 示例在这里)。
使用 URL 重写,会话仅通过包含会话 ID 的 URL 参数进行标识。因此,您的 Web 应用程序的每个内部 URL 都必须使用方法HttpServletResponse.encodeURL() 增加此参数。如果您使用像 Wicket 这样的 Web 框架,则很有可能已经为您完成了此操作。
使用 URL 重写,可以在同一浏览器实例的不同窗口或选项卡中具有几个独立的会话。 更新: 为了回应负评,我想澄清 URL 重写的不同行为:
假设网站的 URL 是 http://webapp.comCookie: 在第一个浏览器选项卡中打开 http://webapp.com
服务器创建一个会话并在响应中发送一个 cookie。
浏览器存储 cookie。
然后在第二个浏览器选项卡中打开 http://webapp.com。浏览器将此 URL 关联到最近存储的 cookie 并将 cookie 添加到请求中。
对于服务器而言,来自第一个或第二个浏览器选项卡的请求以及来自同一会话的响应没有区别。有时这是期望的行为。 URL 重写: 在第一个浏览器选项卡中打开 http://webapp.com
服务器创建 ID 为 1 的会话,并将参数 jsessionid=1 添加到响应页面中的每个 URL 中。没有传输 cookie。

同一网络应用程序中,第一个浏览器选项卡对另一页的所有进一步请求都包括会话ID(例如1)。

然后在第二个浏览器选项卡中打开http://webapp.com这里有区别!因为请求中没有cookie和jsessionid参数,所以服务器创建了一个新会话(即ID 2),并将参数jsessionid = 2添加到响应页面中包含的每个URL中。从此,来自第二个浏览器选项卡的所有后续请求都与会话2相关联。

因此,您可以在同一浏览器中拥有两个独立的会话。


将会话ID编码到URL中除了在没有cookie的情况下使会话ID对客户端可用外,没有任何作用。Cookie不会跨选项卡更改,会话ID也不会更改,导致URL编码的会话ID在选项卡之间保持不变的情况。 - Vineet Reynolds
Cookies和URL重写之间有区别。请查看我的更新答案。 - vanje
1
当用户打开第一个选项卡的链接或将第一个选项卡的URL复制到新选项卡中时,您仍然会遇到问题。 - BalusC
是的,这是真的。如果你需要这个,那么URL重写是无济于事的。但它比没有好,对于许多用例来说已经足够了。 - vanje
我已经取消了踩的操作,但是BalusC的观点是正确的。如果OP试图防止多个选项卡被打开,那么他必须对所有超链接使用JavaScript技巧。 - Vineet Reynolds

0
如果您正在使用JavaScript,我可以为您提供一种解决方法。 a)在登录屏幕上设置一个隐藏参数,并为该隐藏字段设置窗口名称 b)当您登录(提交请求)时,在操作类中检查请求参数是否不为空且等于着陆页面,这是一个有效的请求,表示通过登录来到着陆页面,如果不是,则重定向到无效页面。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接