繁体   English   中英

AngularJS拦截器重试请求

[英]AngularJS interceptor retry request

您好我正在开发一个Angular应用程序,我很少有问题试图重新尝试在http拦截器中进行的最新请求。 我有这个拦截器用于每个请求的身份验证验证,我也有令牌到期的响应。 问题是,当我的令牌过期时,我需要为它获取刷新令牌以获得新的访问权限,如果它成功,那么我将重试截获的请求。

一切都正常。 但是...我有多个被拒绝的401调用,当我尝试登录时(你可以看到console.log消息)。 似乎只有被拒绝的第一个调用才会触发刷新令牌请求。 什么是最好的方法或什么能使它工作? Ty提前。

var _responseError = function (rejection) {
    if (rejection.status === 401) {
        var authService = $injector.get('authService');
        var state = $injector.get('$state');
        var http = $injector.get('$http');
        var deferred = $q.defer();
        if (rejection.data && rejection.data.ErrorCode == errorCodes.missingRole){
            return $q.reject(rejection);
        }
        //var authData = localStorageService.get(authConstant.cookieName);
        var authData = authService.getAuth();
        if (authData) {
               return authService.refreshToken().then(function (response) {
                       console.log("call is: ", rejection);
                    if (response.access_token){
                        //Todo: find a method to resend last request;
                        return http(rejection.config);
                    }
                },
                function (err) {
                    state.go('app.login');
                    return $q.reject(rejection);
                });
        }
        authService.logOut();
        state.go('app.login');
    }
    return $q.reject(rejection);
};

有类似的问题。 我的代码有点不同,但想法是一样的,试试这个

var deferred = $q.defer();
authService.refreshToken().then(function () {
        $http(errorResponse.config).then(deferred.resolve, deferred.reject);
    }, function () {
        authService.logOut().then(deferred.reject);
    });

return deferred.promise;

我已设法使用http缓冲区来解决它,以便将所有未来被拒绝的调用存储到后端。 缓冲区代码在这里: https//github.com/witoldsz/angular-http-auth/blob/master/src/http-auth-interceptor.js

并且我稍微修改了它以使其工作,这是修改版本:

angular.module('authModule').factory('httpBufferService', ['$injector', function($injector) {
/** Holds all the requests, so they can be re-requested in future. */
var buffer = [];
var doAction=false;
/** Service initialized later because of circular dependency problem. */
var $http;

function retryHttpRequest(config, deferred) {
    function successCallback(response) {
        deferred.resolve(response);
    }
    function errorCallback(response) {
        deferred.reject(response);
    }
    $http = $http || $injector.get('$http');
    $http(config).then(successCallback, errorCallback);
}
var bufferData = {
    getItems:function (){
        return buffer;
    },
        /**
         * Appends HTTP request configuration object with deferred response attached to buffer.
         */
    append: function(config, deferred) {
        buffer.push({
            config: config,
            deferred: deferred
        });
    },

    /**
     * Abandon or reject (if reason provided) all the buffered requests.
     */
    rejectAll: function(reason) {
        if (reason) {
            for (var i = 0; i < buffer.length; ++i) {
                buffer[i].deferred.reject(reason);
            }
        }
        buffer = [];
    },
    clean:function(){
        buffer = [];
        doAction = false;
    },
    /**
     * Retries all the buffered requests clears the buffer.
     */
    retryAll: function() {
        if (!doAction){
            doAction = true;
            for (var i = 0; i < buffer.length; ++i) {
                retryHttpRequest(buffer[i].config, buffer[i].deferred);
            }
            bufferData.clean();
        }

    }
};
return bufferData;
}]);

这是实施:

var authData = authService.getAuth();
httpBuffer.append(rejection.config,defer);
if (httpBuffer.getItems().length>1){
    return defer.promise;
}
if (authData) {
   return authService.refreshToken().then(function (response) {
        if (response.access_token){
            httpBuffer.retryAll();
            return defer.promise;            
        }
    },
    function (err) {        
        httpBuffer.clean();
        authService.logOut();        
        return $q.reject(rejection);
    });
}
httpBuffer.clean();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM