2015-10-08 2 views
0

Основная идея заключалась в использовании Http Response Interceptor для перенаправления моей веб-страницы, если она дает статус 401. Но я не знаю, правильно ли я делаю это: я думал, что это что-то вроде этого, но мне кажется сложнее, чем кажется. На данный момент я получаю зависимость Circular.Обнаружена круговая зависимость: Http Response Interceptor 401

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

(function() { 
     'use strict'; 

     angular 
      .module('app', ['ngRoute','ngCookies','ngMessages']) 
      .config(routeConfig); 

     routeConfig.$inject = ['$routeProvider','$httpProvider']; 


     function routeConfig($routeProvider,$httpProvider) { 
      $routeProvider 

       .when('/', { 

        templateUrl: 'login.html', 
        controller : 'LoginController' 
       }) 
       .when('/register', { 

        templateUrl: 'register.html', 
        controller : 'RegisterController' 
       }) 
       .when('/main', { 
        //This gives an 401 status when the user has not been logged in 
        templateUrl: 'home.html', 
        controller : 'HomeController' 

       }) 

       .otherwise('/'); 


      // We need to add this for csrf protection 
      $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; 

      //this gives an Circular dependency error 
      $httpProvider.interceptors.push('HttpResponseInterceptor'); 

     } 

    })(); 

Это моя служба:

(function() { 
    'use strict'; 

    angular 
     .module('app') 
     .factory('HttpResponseInterceptor', HttpResponseInterceptor); 

    HttpResponseInterceptor.$inject = ['$rootScope','$http','$q','$location']; 
    function HttpResponseInterceptor($rootScope,$http,$q,$location) { 

     return { 
      response: function(response){ 
       if (response.status === 401) { 

       } 
       return response || $q.when(response); 
      }, 
      responseError: function(rejection) { 
       if (rejection.status === 401) { 

        $location.path('/login'); 
       } 
       return $q.reject(rejection); 
      } 
     }; 

    } 

})(); 

Update2

Как упоминается в комментарии я был инъекционным к большому количеству вещей. Таким образом, это одна проблема исправлена, но теперь, когда я перехожу на страницу входа в систему, она делает запрос на загрузку страницы (localhost: 8080/user), что приводит к бесконечному циклу перенаправления на страницу входа и сбой в браузере ,

Так есть ли способ я могу сказать перехватчик, который URL, должны быть переориентированы и какие из них не

ответ

2

Это ответ на 2-ой проблемы ...

Вы запросить объект отклонения и добавить некоторые дополнительные условия, чтобы ваше заявление IF ...

вы можете сбросить объект отбраковки с ...

console.log (JSON.stringify (rejection));

затем добавить условия к вашему IF ...

if (rejection.status === 401 && rejection.config.url !== "/url/you/do/not/want/to/change/state/on") { 

    // do state.go or something else here 

} 
+0

Вы, вероятно, захотите использовать метод JS indexOf, чтобы проверить, не делает ли URL (возвращает 0 или более) или не возвращает (возвращает -1) определенную строку , например "/Jesus/loves/you".indexOf (" любит ") === 7 ..." /Jesus/loves/you".indexOf ("hello") === -1 – danday74

+0

Это действительно потрясающе из вас, данди, помогая мне. Теперь я понимаю угловые чуть больше. – Greg

+0

Хороший человек надеется, что вам будет весело с ним :) – danday74

1

это инъекционные услуги, используя $ форсунку помощь?

(function() { 

    'use strict'; 

    angular 
    .module('admin') 
    .factory('HttpInterceptor', httpInterceptor); 

    httpInterceptor.$inject = [ 
    '$q',   // return promises 
    '$injector' // login service injection 
    ]; 

    function httpInterceptor(q, injector) { 
return { 
    responseError: function (rejection) { 

    var url = rejection.config ? rejection.config.url : undefined; 
    var state = injector.get("$state"); 

    if (rejection.status === 401) { 
     if (!(url === "/api/logout" || state.current.name === "login" && url === "/api/authenticated")) { 
     var loginService = injector.get('LoginService'); 
     loginService.logout(); 
     } 
    } 

    if (rejection.status === 403) { 
     state.go("home"); 
    } 
    return q.reject(rejection); 
    } 
}; 
    } 
}()); 
+0

Нет, это не работает. я все равно получаю ту же ошибку. – Greg

+0

Вы вводите много вещей, которые вы используете, используя ... HttpResponseInterceptor. $ Injection = ['$ rootScope', '$ http', '$ q', '$ location']; но вы используете только q и местоположение - удаляет ли помощь другого? – danday74

+0

Теперь приложение работает, но когда я иду в/main, он показывает черную страницу, а не перенаправляется на страницу входа в систему. – Greg

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