防止浏览器选项卡之间的会话共享

Posted

技术标签:

【中文标题】防止浏览器选项卡之间的会话共享【英文标题】:Prevent session sharing between browser tabs 【发布时间】:2019-04-27 19:47:51 【问题描述】:

我有一个讨厌的错误:打开两个带有登录页面的标签,并在每个标签中使用不同的用户登录。来自登录的第一个选项卡的所有请求都返回“未经授权”错误。 前端使用 SESSION cookie,看起来该 cookie 被第二个标签页的第二次成功登录覆盖,它在第一个标签页中浏览时尝试使用这个新 cookie。

使用 Spring Boot 1.5.8、Spring-session 2、AngularJS 1.7.2 配置非常标准,所以我认为这些样板文件没有用。

直到现在我尝试在后端设置一个在身份验证之前工作的过滤器,以某种方式过滤掉已知 cookie 的请求,但我失败了。

更新: 当用户登录但会话不正确时,某种防止这种情况的方法是我所寻求的。阻止在此浏览器中的第二次登录尝试,或者在另一个人登录同一个浏览器时踢出已经登录的用户 - 都可以。

【问题讨论】:

这是正常和预期的行为。如果您没有这种行为,那么每次您在新标签页中打开链接时都会丢失会话。 你想要什么? @Rachmaninoff 我倾向于防止其他用户再次登录。 如果在登录前打开了两个标签页,则无法解决。 @Rachmaninoff 是的,就是这样。但是其他人如何解决这个问题?可能是某种自动刷新登录页面? 【参考方案1】:

如果您在本地存储上设置某种令牌,如以下代码(来自服务器的成功登录响应),您可以从其他选项卡中注销用户

 localStorage.setItem('logout', 'logout-' + Math.random());

并将此功能作为主应用模块中的运行块:

 function logoutFromOtherTabs(authService, $timeout) 
        'ngInject';

        window.addEventListener('storage', function (event) 
            if (event.key === 'logout') 
                $timeout(function () 
                    authService.logout();
                , 1000);
            
        );

【讨论】:

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

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

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

浏览器会话存储。在标签之间共享?

Android 共享首选项分配不会在模拟器会话之间持续存在

在 Rails 和 Spring MVC 之间共享会话

在两个不同的 Web 浏览器之间共享会话