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

时间:2014-01-20 09:32:44

标签: angularjs authentication

我想在Angular.js的单页Web应用程序上实现身份验证。 official Angular documentation建议使用拦截器:

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

    // ...

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

问题是服务器发送401错误,浏览器立即停止“未授权”消息,或者使用登录弹出窗口(当服务器发送认证HTTP标头时),但Angular无法捕获它拦截要处理的HTTP错误,如建议的那样。我误会了什么吗?我尝试了在网络上找到的更多示例(例如thisthisthis),但没有一个有效。

4 个答案:

答案 0 :(得分:62)

对于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');
}])

答案 1 :(得分:26)

在app config block中:

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);
  }
}];

答案 2 :(得分: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);
                }

答案 3 :(得分:7)

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