Angularjs 在Angular js中,在每次ajax调用之前调用ajax调用
我在做一个角度的项目。当我登录到应用程序时,我将从登录服务接收的访问令牌保存到$cookies中。此访问令牌在2分钟后过期。 登录后,对于subsequest功能,我必须使用$http将此访问令牌发送到服务以获得有效响应。 一旦这个访问令牌在2分钟后过期,我将调用一个服务,该服务将重新生成访问令牌并再次保存$cookies。 如果没有访问令牌,我的其他功能将无法工作 基本上,我需要在应用程序中的每个服务调用之前检查$cookies中是否存在访问令牌。如果不存在访问令牌,则需要使用$http通过另一个服务调用重新生成它,并将其保存回cookie中,然后保存到功能的所需服务调用中。如果存在访问令牌,则执行所需的服务调用 我的功能之一是:Angularjs 在Angular js中,在每次ajax调用之前调用ajax调用,angularjs,cookies,Angularjs,Cookies,我在做一个角度的项目。当我登录到应用程序时,我将从登录服务接收的访问令牌保存到$cookies中。此访问令牌在2分钟后过期。 登录后,对于subsequest功能,我必须使用$http将此访问令牌发送到服务以获得有效响应。 一旦这个访问令牌在2分钟后过期,我将调用一个服务,该服务将重新生成访问令牌并再次保存$cookies。 如果没有访问令牌,我的其他功能将无法工作 基本上,我需要在应用程序中的每个服务调用之前检查$cookies中是否存在访问令牌。如果不存在访问令牌,则需要使用$http通过另
mPosController.controller('offerController', ['$scope', '$route', '$cookies', '$rootScope', 'mosServiceFactory', 'ngDialog', '$modal', '$q', function ($scope, $route, $cookies, $rootScope, mosServiceFactory, ngDialog, $modal, $q) {
mosServiceFactory.viewAllOffers('page=0').then(function (data) {
//Do the desire functionality
});
}]);
我的服务是:
mPosServices.factory('mosServiceFactory', function ($http, $rootScope, $cookies,$q) {
return{
viewAllOffers: function (page) {
var allOffers = $http({
method: "get",
url: "myserviceurl?enrollmentId=" + $rootScope.enrollMentId + "&" + page + "&size=10&access_token=" + $cookies.get('access_token'),
});
return allOffers;
},
refresh_token: function () {
var refreshToken = $http({
method: "get",
url: "myserviceurl/oauth/token?grant_type=refresh_token&client_id=restapp&client_secret=restapp&refresh_token=" + $cookies.get('refresh_token'),
})
return refreshToken;
},
}
});
因此,在调用viewAllOffers()之前,我需要检查$cookies中是否存在access_令牌,如果没有,则调用refresh_令牌服务
我一般如何做到这一点
基本上,我需要检查$cookies中是否存在访问令牌
在应用程序中的每个服务调用之前。如果访问令牌不是
现在,然后需要重新生成它
。。我一般如何做到这一点
在进行任何
调用之前,您只需创建一个拦截器
来检查cookie中是否存在访问令牌
。您需要添加use$injector
以在拦截器内获取moservicefactory
实例
mPosServices.service('APIInterceptor', ['$injector', '$cookies', function($injector, $cookies) {
var service = this;
service.request = function(config) {
if (!$cookies.get('access_token') && config.url.indexOf('myservice/oauth/token?grant_type=') === -1) {
return $injector.get('mosServiceFactory').refresh_token().then(function(response) {
var date = new Date();
date.setTime(date.getTime() + (response.data.expiresIn * 1000));
$cookies.remove('access_token');
$cookies.put('access_token', response.data.value, {
expires: date
});
$cookies.put('refresh_token', response.data.refreshToken.value);
}).then(function() {
return config; // <-- token is refreshed, reissue original request
});
}
return config;
};
service.responseError = function(response) {
return response;
};
}]);
编辑:由于对
刷新\u令牌的请求也使用了$http
服务,因此您将得到一个循环依赖项错误。这是因为每当您发现$cookies.get('access\u token')
为空时,拦截器将尝试从moservicefactory.refresh\u token()
获取新的令牌,这将再次使拦截器发挥作用。为了避免这种情况,您需要在apinterceptor
中进行检查,以便在grant\u type!='刷新令牌“
您可以尝试使用$http
服务中的请求
拦截器,这是一些文档,向下滚动到拦截器部分,我正在做与上面代码中所示完全相同的事情,但我得到的错误如下找到循环依赖:$http@Rahul:是的,我错过了。您得到循环依赖项错误是因为apinterceptor
调用moservicefactory.refresh\u-token
每当它找不到访问令牌时。由于拦截器在所有请求/响应周期中充当中间件,因此它尝试调用refresh\u令牌
,即使$http请求是从refresh\u令牌本身发出的。请检查更新的答案。哦,是的。现在我明白了为什么会出现此错误,但是配置对象是否具有grand_类型属性?或者我们需要为每个$http调用设置此属性,以便可以在拦截器中捕获它?您自己正在refresh\u token()
请求URL中设置它<代码>url:“myserviceurl/oauth/token?grant_type=refresh_token..
@Rahul:已更新代码。有关详细信息,请参阅asnwer。
module.config(['$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push('sessionInjector');
}]);