Cattura HTTP 401 con l’intercettore Angular.js

Mi piacerebbe implementare l’autenticazione su un’applicazione web a singola pagina con Angular.js. La documentazione ufficiale Angular raccomanda l’uso di intercettori:

$provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) { return { // ... 'responseError': function(rejection) { // do something on error if (canRecover(rejection)) { return responseOrNewPromise } return $q.reject(rejection); } }; }); 

Il problema si verifica quando il server invia un errore 401, il browser si arresta immediatamente con il messaggio “Non autorizzato” o con la finestra di accesso (quando l’intestazione HTTP di autenticazione viene inviata dal server), ma Angular non può acquisire con il suo intercettatore l’HTTP errore da gestire, come raccomandato. Sto fraintendendo qualcosa? Ho provato più esempi trovati sul web ( questo , questo e questo ad esempio), ma nessuno di loro ha funzionato.

nel blocco di configurazione dell’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); } }]; 

Per AngularJS> 1.3 utilizzare $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'); }]) 

Non so perché, ma la risposta con errore 401 va in funzione di successo.

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

Gli intercettori AngularJS funzionano solo per le chiamate effettuate con il servizio $ http; se si naviga verso una pagina che restituisce un 401, AngularJS non viene mai eseguito.