用Angular.js拦截器捕获HTTP 401

我想用Angular.js在单个页面的web应用上实现validation。 Angular官方文档build议使用拦截器:

$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错误,浏览器立即停止与“未经授权”的消息,或与loginpopup窗口(当authentication的HTTP标头是由服务器发送的),但Angular无法捕捉与它的拦截HTTPerror handling,build议。 我误解了什么? 我尝试了更多在网上find的例子(例如这个和这个例子),但是没有一个能够工作。

在应用程序configuration块:

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

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

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

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

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