使用Angular.js拦截器捕获HTTP 401

Csa*_*ati 46 authentication angularjs

我想在Angular.js的单页Web应用程序上实现身份验证.在官方文档角建议使用拦截器:

$provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
  return {

    // ...

    'responseError': function(rejection) {
      // do something on error
      if (canRecover(rejection)) {
        return responseOrNewPromise
      }
      return $q.reject(rejection);
    }
  };
});
Run Code Online (Sandbox Code Playgroud)

问题是当服务器发送401错误时,浏览器立即停止"未授权"消息,或者使用登录弹出窗口(当服务器发送认证HTTP标头时),但Angular无法使用它的拦截器捕获HTTP按照建议处理错误.我误会了什么吗?我试图在网络上找到更多的例子(这个,这个这个为例),但他们没有工作.

Igo*_* S. 63

对于AngularJS> 1.3使用 $httpProvider.interceptors.push('myHttpInterceptor');

.service('authInterceptor', function($q) {
    var service = this;

    service.responseError = function(response) {
        if (response.status == 401){
            window.location = "/login";
        }
        return $q.reject(response);
    };
})
.config(['$httpProvider', function($httpProvider) {
    $httpProvider.interceptors.push('authInterceptor');
}])
Run Code Online (Sandbox Code Playgroud)


Gec*_* IT 27

在app配置块中:

var interceptor = ['$rootScope', '$q', "Base64", function(scope, $q, Base64) {
  function success(response) {
    return response;
  }

  function error(response) {
    var status = response.status;
    if (status == 401) {
      //AuthFactory.clearUser();
      window.location = "/account/login?redirectUrl=" + Base64.encode(document.URL);
      return;
    }
    // otherwise
    return $q.reject(response);
  }
  return function(promise) {
    return promise.then(success, error);
  }
}];
Run Code Online (Sandbox Code Playgroud)

  • 在1.3中,它绑定如下:$ httpProvider.interceptors.push('interceptor'); (8认同)
  • 1.3中不再支持responseInterceptor (3认同)

小智 8

我不知道为什么,但401错误的响应进入成功功能.

'responseError': function(rejection)
                {
                    // do something on error

                    if (rejection.status == 401)
                    {
                        $rootScope.signOut();
                    }

                    return $q.reject(rejection);
                },
                'response': function (response) {
                    // do something on error
                    if (response.status == 401) {
                        $rootScope.signOut();
                    };
                    return response || $q.when(response);
                }
Run Code Online (Sandbox Code Playgroud)


eja*_*ain 7

AngularJS拦截器仅适用于使用$ http服务进行的调用; 如果您导航到返回401的页面,AngularJS甚至都不会运行.

  • 这取决于你所谓的导航.完全加载页面(window.location)确实不会触发拦截器.但是导航到应用程序中的另一条路线将会导致路由模板使用$ http服务获取. (5认同)