Захват HTTP 401 с помощью перехватчика Angular.js
Я хотел бы реализовать проверку подлинности в одностраничном веб-приложении с помощью Angular.js. Официальная Angular документация рекомендует использовать перехватчики:
$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 обрабатывать, как рекомендовано. Я что-то не понимаю? Я попробовал больше примеров, найденных в Интернете (this, this и this), но никто из них не работал.
Ответы
Ответ 1
в блоке конфигурации приложения:
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
Для 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');
}])
Ответ 3
Я не знаю, почему, но ответ с ошибкой 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);
}
Ответ 4
Перехватчики AngularJS работают только для вызовов, сделанных с помощью службы $http; если вы перейдете на страницу, которая возвращает 401, AngularJS никогда не запускается.