在我的SPA中,我从REST请求中捕获每个401响应。从那里我不立即重定向到登录页面,但首先我检查后端,如果问题是令牌已经过期。如果没有(用户不知道)我重定向到登录,但如果它是一个过期的问题,我生成一个新的令牌,然后我再次运行先前失败的请求到401.这是我的拦截器的代码:
var $http, loginService;
return function (promise) {
return promise.then(function (response) {
return response;
}, function (response) {
if (response.status === 401) {
$http = $http || $injector.get('$http');
loginService = loginService || $injector.get('loginService');
var defer = $q.defer();
var promiseToken = defer.promise;
var configPreviousRequest = response.config;
console.log(configPreviousRequest);
var url = configurationService.serverUrl + "mobile" + configurationService.apiVersion + "/verify";
var request = $http.post(url, {'code': loginService.getVmmToken()});
// Get the token. If success, we try to login again
return request.then(
function (responseVerify) {
loginService.setVmmsToken(responseVerify.data);
loginService.setAuthentificationToken();
configPreviousRequest.headers.vmmsToken = responseVerify.data;
return $http(configPreviousRequest);
},
function () {
$location.path('/login');
});
}
return $q.reject(response);
});
};
但这是Chrome网络工具的结果。所有方法的编号都不正确(对于/ verify和/ blocks调用次数太多)
所以我记录了(使用console.log(configPreviousRequest);)看看会发生什么。以下是日志:
我们清楚地观察到,对于一个401错误,我多次拦截它。 我不知道为什么:)
有人知道吗? 感谢