【问题标题】:logout user from all active tabs从所有活动选项卡中注销用户
【发布时间】:2018-05-09 01:53:13
【问题描述】:

我在三个单独的选项卡中打开了我的应用程序的三个实例,用户从一个选项卡中注销,并在同一个选项卡中使用另一个凭据登录,然后使用其他两个选项卡之一开始浏览,如何注销用户从这两个标签?

我的前端技术是 AngularJS,API 是用 Web Api 编写的,我使用令牌进行身份验证,令牌存储在会话 cookie 中。

【问题讨论】:

  • 看看这个SO问题。
  • @JeroenHeier 我不使用本地存储,令牌存储在cookie中
  • @JeroenHeier 我也想在用户关闭浏览器时注销用户,这对于 localstorage 是不可能的,而且 sessionStorage 也不适合,因为如果用户在选项卡中登录,我希望他也可以登录其他标签。

标签: javascript angularjs cookies login logout


【解决方案1】:

当用户从一个选项卡注销时,您可以向服务器发送请求以禁用/销毁令牌。

在您的 Web API 中,您可以检查令牌是否有效,如果不是,您可以返回未经授权的状态代码。

if (!IsValidToken())
    return Request.CreateResponse(HttpStatusCode.Unauthorized,ErrorMessage);

当您从服务器收到未经授权的状态时,使用拦截器将用户重定向到您的登录页面。

.factory('myInterceptor', ['$q', '$location', '$injector', function ($q, $location, $injector) {
    return {
        response: function (response) {
            return response || $q.when(response);
        },
        responseError: function (rejection) {
            if (rejection.status === 401) {
                var stateService = $injector.get('$state');
                stateService.go('login');
            }
            return $q.reject(rejection);
        }
    }
}])
.config(['$httpProvider', function ($httpProvider) {
    $httpProvider.interceptors.push('myInterceptor');
}]);

只有当用户从其他选项卡发出进一步请求时,才会将用户重定向到登录。如果您希望它们在不执行任何请求的情况下被重定向,您可以使用 $interval 每隔几秒检查一次令牌的有效性。

【讨论】:

  • 感谢您的回答,我不想尽可能多地使用$interval,我更喜欢确定性的方法...
【解决方案2】:

当用户点击注销时,下面的脚本会起作用

<?php

if (isset($_POST['submit'])) {
session_start();
session_unset();
session_destroy();
header("Location: ../index.php");
exit();
}

它会自动从所有选项卡中销毁会话。当用户在一个选项卡中使用其他凭据登录时,他仍然能够在其他选项卡中访问同一页面,因为会话仍然在页面上使用他的凭据进行。

【讨论】:

  • 我的登录由存储在 cookie 中的令牌处理,它是 REST,后端是 Web API
猜你喜欢
  • 2016-02-14
  • 2022-01-20
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
  • 1970-01-01
  • 2020-05-19
相关资源
最近更新 更多