Angularjs 在Angular js中,在每次ajax调用之前调用ajax调用

Angularjs 在Angular js中,在每次ajax调用之前调用ajax调用,angularjs,cookies,Angularjs,Cookies,我在做一个角度的项目。当我登录到应用程序时,我将从登录服务接收的访问令牌保存到$cookies中。此访问令牌在2分钟后过期。 登录后,对于subsequest功能,我必须使用$http将此访问令牌发送到服务以获得有效响应。 一旦这个访问令牌在2分钟后过期,我将调用一个服务,该服务将重新生成访问令牌并再次保存$cookies。 如果没有访问令牌,我的其他功能将无法工作 基本上,我需要在应用程序中的每个服务调用之前检查$cookies中是否存在访问令牌。如果不存在访问令牌,则需要使用$http通过另

我在做一个角度的项目。当我登录到应用程序时,我将从登录服务接收的访问令牌保存到$cookies中。此访问令牌在2分钟后过期。 登录后,对于subsequest功能,我必须使用$http将此访问令牌发送到服务以获得有效响应。 一旦这个访问令牌在2分钟后过期,我将调用一个服务,该服务将重新生成访问令牌并再次保存$cookies。 如果没有访问令牌,我的其他功能将无法工作

基本上,我需要在应用程序中的每个服务调用之前检查$cookies中是否存在访问令牌。如果不存在访问令牌,则需要使用$http通过另一个服务调用重新生成它,并将其保存回cookie中,然后保存到功能的所需服务调用中。如果存在访问令牌,则执行所需的服务调用

我的功能之一是:

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');
}]);