我正在尝试为AngularJS应用编写HTTP拦截器以处理身份验证。
这段代码有效,但是我担心手动注入服务,因为我认为Angular应该自动处理此问题:
app.config(['$httpProvider', function ($httpProvider) { $httpProvider.interceptors.push(function ($location, $injector) { return { 'request': function (config) { //injected manually to get around circular dependency problem. var AuthService = $injector.get('AuthService'); console.log(AuthService); console.log('in request interceptor'); if (!AuthService.isAuthenticated() && $location.path != '/login') { console.log('user is not logged in.'); $location.path('/login'); } return config; } }; }) }]);
我刚开始做的事情,但是遇到了循环依赖问题:
app.config(function ($provide, $httpProvider) { $provide.factory('HttpInterceptor', function ($q, $location, AuthService) { return { 'request': function (config) { console.log('in request interceptor.'); if (!AuthService.isAuthenticated() && $location.path != '/login') { console.log('user is not logged in.'); $location.path('/login'); } return config; } }; }); $httpProvider.interceptors.push('HttpInterceptor'); });
我担心的另一个原因是Angular Docs中$ http上的部分似乎显示了一种将依赖项注入“常规方式”到Http拦截器中的方法。请参阅“拦截器”下的代码段:
// register the interceptor as a service $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) { return { // optional method 'request': function(config) { // do something on success return config || $q.when(config); }, // optional method 'requestError': function(rejection) { // do something on error if (canRecover(rejection)) { return responseOrNewPromise } return $q.reject(rejection); }, // optional method 'response': function(response) { // do something on success return response || $q.when(response); }, // optional method 'responseError': function(rejection) { // do something on error if (canRecover(rejection)) { return responseOrNewPromise } return $q.reject(rejection); }; } }); $httpProvider.interceptors.push('myHttpInterceptor');
上面的代码应该放在哪里?
我想我的问题是执行此操作的正确方法是什么?
谢谢,我希望我的问题很清楚。
您在$ http和AuthService之间具有循环依赖关系。
您通过使用该$injector服务所做的事情是通过延迟AuthService上$ http的依赖关系来解决“鸡与蛋”问题。
$injector
我相信您所做的实际上是最简单的方法。
您还可以通过以下方式执行此操作:
run()
config()
AuthService.setHttp()