Подтвердить что ты не робот

Захват 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), но никто из них не работал.

4b9b3361

Ответ 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 никогда не запускается.