2016-01-05 4 views
2

Я создал HTTP-перехватчик ответа, который проверяет код состояния 401. Если код 401, он должен просто писать в консоли браузера, но это не работает. Кажется, он даже не поймал его.Не удалось поймать код состояния 401 с помощью Angular HttpInterceptor

App.js:

'use strict'; 

// Declare app level module which depends on views, and components 
var app = angular.module('myApp', []); 




app.factory('authHttpResponseInterceptor', ['$q', '$location', function ($q, $location) { 
     return { 
      response: function (response) { 
       if (response.status === 401) { 
        console.log("Response 401"); 
       } 
       else 
       { 
        console.log("other response but no 401"); 
       } 
       return response || $q.when(response); 
      }, 
      responseError: function (rejection) { 
       if (rejection.status === 401) { 
        console.log("Response Error 401", rejection); 
       } 
       return $q.reject(rejection); 
      } 
     } 
    }]) 
     .config(['$httpProvider', function ($httpProvider) { 
       //Http Intercpetor to check auth failures for xhr requests 
       $httpProvider.interceptors.push('authHttpResponseInterceptor'); 
      }]); 

Index.html

<html lang="en" ng-app="myApp"> 
<head> 
    <meta charset="utf-8"> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
    <title>My AngularJS App</title> 
    <meta name="description" content=""> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 

</head> 
<body> 

    <div ng-controller="testCtrl"></div> 

    <script src="bower_components/angular/angular.js"></script> 
    <script src="app.js"></script> 
    <script src="testController.js" type="text/javascript"></script> 

</body> 
</html> 

testController.js

app.controller('testCtrl', function ($scope, $http, $timeout) { 


    $http.get('http://ec2-54-229-72-240.eu-west-1.compute.amazonaws.com:8080/webservice/api/stuffs/onestuff', { 
     headers: {'Authorization': 'Bearer ' + localStorage.getItem('access_token')} 
    }).success(function (data) { 
     alert(data.id); 
    }); 

}); 

Маркер доступа хранится в локальном хранилище от предыдущей целевой страницы/входа , То, что я пытаюсь достичь, - перенаправить пользователя на эту целевую страницу, если его токен больше не действителен, или если у него его нет.

Имея действующий токен, никаких проблем, я успешно извлекаю данные из api. Но когда я вручную изменяю сохраненный токен, чтобы вызвать 401, ничего не написано в консоли браузера.

Я уверен, что это 401 Несанкционированный отклик, потому что я проверил его в браузере Chrome. Вот единственное, что я получаю:

XMLHttpRequest cannot load http://ec2-54-229-72-240.eu-west-1.compute.amazonaws.com:8080/webservice/api/students/chat. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8383' is therefore not allowed access. The response had HTTP status code 401. 

А вот запросы (да, потому что когда-то у меня есть только один запрос в списке, и при обновлении страницы, что-то добавить, что есть два из них)

Name Status  Type  Initiator 
stuff 200  xhr  angular.js:10765 
stuff 401  xhr  Other 

Вот что я говорил о том, за это время, когда я обновил страницу я имел два запроса сделано, но это странно, потому что я только сделать один запрос в моем коде.

И когда-то, после нескольких обновления я только:

Name Status  Type  Initiator 
stuff 401  xhr  Other 

Но в обоих случаях, я никогда ничего не было написано в консоли, что и доказывает мне, что ошибка 401 была поймана.

Спасибо, и извините за плохой английский!

ответ

0

Попробуйте заменить console.log на $ log.log. Вам нужно будет добавить его в зависимости, как $ q и $ location.

в качестве примера:

(function(){ 
    'use strict'; 
    angular.module('testModule', []) 
     .factory('testFactory', testFactory); 

    testFactory.$inject = ['$log', '$q', '$location']; 
    function testFactory($log, $q, $location){ 
    $log.log('This will log to the console'); 
    } 
})(); 
1

Попробуйте добавить запрос и RequestError функции (на всякий случай, я знаю, что это не является обязательным):

request: function(config) { 
     return config; 
     }, 
requestError: function(err) { 
     $q.reject(err); 
     }, 

http://jsfiddle.net/tjruzpmb/218/

Я изменил URL но он работает. Также обратите внимание на мои комментарии. Ошибка 401 никогда не будет зацепиться в ответ(), потому что перехватчик всегда перенаправляет 401 на responseError().

+0

Спасибо, что вы спасли мои минуты! – ivahidmontazer

Смежные вопросы