会话在选项卡之间共享

Posted

技术标签:

【中文标题】会话在选项卡之间共享【英文标题】:Session shared in between tabs 【发布时间】:2011-09-08 17:58:53 【问题描述】:

我有 JAVA Web 应用程序,我需要停止在浏览器选项卡之间共享会话,这意味着

用户打开浏览器,登录他的帐户并在同一浏览器的新选项卡中打开特定页面。根据默认设置,会话将共享到新选项卡,并且用户会自动登录到新选项卡。谁能告诉我如何停止这种情况,所以如果不是整个应用程序,我至少可以将它限制在几个敏感页面中。

【问题讨论】:

How to differ sessions in browser-tabs?的可能重复 您在应用程序中使用 javascript 【参考方案1】:

通常 cookie 用于会话处理。然后所有选项卡和浏览器窗口共享同一个会话。但是您可以将您的 servlet 容器配置为使用 URL 重写而不是 cookie。 (这里是example for Jetty。)

使用 URL 重写时,会话只能通过包含会话 ID 的 URL 参数来识别。因此,您的 Web 应用程序的每个内部 URL 都必须使用方法 HttpServletResponse.encodeURL() 使用此参数进行增强。如果您正在使用像 Wicket 这样的 Web 框架,那么很有可能这已经为您完成了。

通过 URL 重写,可以在同一浏览器实例的不同窗口或选项卡中拥有多个独立会话。

更新: 为了回应反对票,我想明确 URL 重写的不同行为:

假设网站的 URL 是http://webapp.com。

Cookie: 在第一个浏览器选项卡中打开 http://webapp.com。

服务器创建一个会话并在响应中发送一个 cookie。

浏览器存储 cookie。

然后在第二个浏览器选项卡中打开http://webapp.com。浏览器将此 URL 与最近存储的 cookie 相关联,并将 cookie 添加到请求中。

对于服务器而言,来自第一个或第二个浏览器选项卡的请求和来自同一会话的响应之间没有区别。有时这是期望的行为。

网址重写: 在第一个浏览器选项卡中打开 http://webapp.com。

服务器创建一个 ID 为 1 的会话,并将参数 jsessionid=1 添加到响应页面中的每个 URL。没有 cookie 被传输。

从第一个浏览器选项卡对同一 web 应用的另一个页面的所有进一步请求都包括会话 ID(例如 1)。

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

所以你在同一个浏览器中有两个独立的会话。

【讨论】:

-1。在 URL 中编码会话 ID 除了使会话 ID 在没有 cookie 的情况下对客户端可用之外没有任何作用。 Cookie 不会跨标签更改,会话 ID 也不会更改,从而导致 URL 编码的会话 ID 在标签之间保持不变。 cookie 和 URL 重写是有区别的。请参阅我的更新答案。 当用户打开第一个选项卡的链接或在新选项卡中复制第一个选项卡的 URL 时,您仍然会遇到问题。 是的,这是真的。如果你需要这个,那么 URL 重写是没有帮助的。但对于许多用例来说,总比没有好。 我已经删除了反对票,但 BalusC 的观点是有效的。如果 OP 试图阻止打开多个选项卡,那么他必须对所有超链接使用 JavaScript 技巧。【参考方案2】:

如果您使用的是 javascript,我可以为您提供一种解决方法。 a) 在登录界面有一个隐藏参数,设置该隐藏字段的窗口名 b)当你登录(提交请求)时,在action类中检查request参数是否不为null并且它等于landing page,它是一个有效的请求,意味着通过登录进入到landing page,如果没有重定向到无效页面.

【讨论】:

以上是关于会话在选项卡之间共享的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security - 如何禁用同一浏览器的多个选项卡之间的相同会话共享?

浏览器会话存储。标签之间共享? [重复]

检测选项卡之间的会话结束

如何在浏览器选项卡之间共享单个 js 资源?

AngularJS - 在选项卡/窗口之间共享一个 websocket

无法在选项卡视图控制器之间共享数据?