【问题标题】:Calling ajax call before Every other ajax call in Angular js在Angular js中的所有其他ajax调用之前调用ajax调用
【发布时间】:2015-06-25 09:41:44
【问题描述】:

我正在做 Angular 项目。当我登录到应用程序时,我将从登录服务收到的 access_token 保存到 $cookies 中。此 access_token 会在 2 分钟后过期。 登录后,对于 subsequest 功能,我必须使用 $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 服务。

我一般如何做到这一点?

【问题讨论】:

  • 你可以在$http服务中尝试request拦截器,here是一些文档,向下滚动到拦截器部分

标签: angularjs cookies


【解决方案1】:

基本上我需要检查 $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)并拦截任何响应错误。

您需要在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' 时让请求继续进行

【讨论】:

  • 我正在做与上面代码中显示的完全相同的事情,但是我收到错误 "找到循环依赖项:$http 不知道我在这里做错了什么。
  • @Rahul:是的,我错过了。您收到循环依赖错误,因为APIInterceptor 会在找不到 access_token 时调用mosServiceFactory.refresh_token。由于拦截器在所有请求/响应周期中充当中间件,因此即使 $http 请求是从 refresh_token 本身发出的,它也会尝试调用 refresh_token。请检查更新的答案。
  • 哦是的..现在我明白为什么我会收到这个错误,但是配置对象有 grand_type 属性吗?或者我们需要为每个 $http 调用设置这个属性,这样才能在拦截器中被捕获?
  • 您自己在 refresh_token() 请求 URL 中设置它。 url: "myserviceurl/oauth/token?grant_type=refresh_token..
  • @Rahul:更新了代码。详情请见thisasnwer。
猜你喜欢
  • 1970-01-01
  • 2022-07-25
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多