在Angular js中的每个其他ajax调用之前调用ajax调用

时间:2015-06-25 09:41:44

标签: angularjs cookies

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

基本上我需要在应用程序中的每次服务调用之前检查$ 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_token,如果不是则调用refresh_token服务。

我如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

  

基本上我需要检查$ cookies中是否存在访问令牌   在应用程序中的每个服务调用之前。如果没有访问令牌   现在,然后需要再生它..

     

..我如何实现这一点?

在进行任何 interceptor来电之前,您只需创建access_token即可检查Cookie中是否存在$http。您需要添加use $injector以在拦截器内获取mosServiceFactory实例。

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

APIInterceptor将监控使用$http服务发出的所有请求,执行先决条件操作(,如重新生成access_token )并拦截任何响应错误。

你需要将拦截器推到$httpProvider函数的config

module.config(['$httpProvider', function($httpProvider) {  
    $httpProvider.interceptors.push('sessionInjector');
}]);

编辑:由于对refresh_token的请求也在使用$http服务,因此会出现循环依赖性错误。这是因为每当你发现$cookies.get('access_token')为空时,拦截器将尝试从mosServiceFactory.refresh_token()获取一个新的令牌,这将再次带来拦截器。为避免这种情况,您需要在APIInterceptor内进行检查,以便在grant_type !='refresh_token'

后继续请求