在 Angular js 中每隔 ajax 调用之前调用 ajax 调用

Calling ajax call before Every other ajax call in Angular js

我正在从事 angular 项目。当我登录到应用程序时,我将从登录服务收到的 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() 之前,我需要检查 access_token 是否存在于 $cookies 中,如果不存在则调用 refresh_token 服务。

我一般如何实现这一目标?

Basically I need to check if access token present in $cookies or not before every service call in the application. If access token is not present, then Need to regenerate it..

.. How do I achieve this generically?

您可以简单地创建一个 interceptor 来检查 access_token 是否存在于 cookie 中,然后再进行 any $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)并拦截任何响应错误。

您需要在 config 函数中将拦截器推送到 $httpProvider

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

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

时让请求继续