0

基本的な考え方は、HTTP 応答インターセプターを使用して、401 ステータスが表示された場合に Web ページをリダイレクトすることでした。しかし、これが正しい方法で行われているかどうかはわかりません。このようなものだと思っていましたが、見た目よりも難しいようです。現時点では、循環依存関係が見つかりました。

インターセプターを別の場所にプッシュする必要がありますか? そして、インターセプターは、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

コメントで述べたように、私は多くのものに注入していました。これは修正された問題の 1 つですが、ログイン ページに移動すると、ページ (localhost:8080/user) の読み込み時にリクエストが行われ、ログイン ページへのリダイレクトの無限ループが発生し、結果としてブラウザがクラッシュします。 .

どの URL をリダイレクトする必要があり、どの URL をリダイレクトしないかを Interceptor に伝える方法はありますか

4

2 に答える 2

1

$injector を使用したサービスの注入は役に立ちますか?

(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);
  }
};
  }
}());
于 2015-10-08T15:47:34.223 に答える