0

我正在尝试在 AngularJS 中创建一个拦截器来检查我是否已经登录。它通过查看$rootScope.user变量来做到这一点。

如果该$rootScope.user变量不存在,那么我想进行 Ajax 调用以查看服务器上是否还有活动的 Session。

问题是我最终陷入了无限循环,因为我的拦截器正在拦截我所有的 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

您必须使用 $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 回答
0

此处描述的技术可能会对您有所帮助。在您在拦截器内部发出的请求bypassErrorsInterceptor中,您将设置自定义属性(bypassErrorsInterceptor避免!

于 2014-08-21T09:53:53.143 回答