0

既にログインしているかどうかを確認するインターセプターを AngularJS で作成しようとしています。これは、$rootScope.user変数を調べることによって行われます。

$rootScope.user変数が存在しない場合は、Ajax 呼び出しを行って、サーバー上にまだセッションが存在するかどうかを確認します。

問題は、インターセプターがすべての Ajax リクエストをインターセプトしているため、無限ループになってしまうことです...

私は基本的にこれを持っています:

.factory('resourceInterceptor', ['$rootScope', 'AccountService', function($rootScope, accountService) {
    return {
        request: function(request) {
            if(!$rootScope.user) {
                var userData = accountService.getUserSession(); // creates loop
                //var userData = $http.get('api/Account'); // Same thing
            }

            return request;
        }
    }
}]);

しかし、これは機能しません。次のエラーが発生します。

Error: [$injector:cdep] Circular dependency found: $http <- $resource <- AccountService <- resourceInterceptor <- $http <- $compile

または $http と同じ:

Error: [$injector:cdep] Circular dependency found: $http <- resourceInterceptor <- $http <- $compile

では、どうすればこの問題を解決できますか? データベースからユーザー情報を取得できるように、インターセプターから Ajax リクエストを実行したいと考えています。


注意: ヘッダーでトークンを使用するなど、ある種の認証方法を実装するには、さまざまな、おそらくより良い方法があることを私は知っています。私はそれを認識しており、別のより優れた認証方法についての回答を探しているわけではありません。この特定の問題についての回答が欲しいです。

4

2 に答える 2

0

ここで説明する手法は、おそらく役立つでしょう。bypassErrorsInterceptorインターセプター内で作成するリクエストでは、カスタム プロパティを設定しますbypassErrorsInterceptor(避けた!

于 2014-08-21T09:53:53.143 に答える
0

$injector サービスを使用し、その機能を使用して $http サービスを取得する必要があります。

次のようになります ($http の例):

.factory('resourceInterceptor', ['$rootScope', '$injector', '$q', function($rootScope, $injector, $q) {

    return {
        request: function(config) {

            var $http = $injector.get('$http');

            if(!$rootScope.user) {
                var userData = $http.get('api/Account');
            }

            return config || $q.when(config);
        }
    }
}]);

これは、インターセプター内で $http を使用する場合の既知の循環依存問題です (それぞれが相互に依存しています)。


plunkr の例 - http://plnkr.co/edit/7zEuVlHgGNyBbzCg8Lfi?p=preview

公式の AngularJS github リポジトリに関するこの問題と回答 -リンク

AngularJS の公式ドキュメントからの $injector に関する情報 -リンク

Egghead.io の $injector に関する情報 -リンク

于 2014-08-21T08:40:19.553 に答える