我已经为我的WEB API实现了刷新令牌功能,因此用户可以使用刷新令牌获取新令牌。
每当API返回未经授权的状态代码时,我需要获取新令牌并使用该新令牌更新所有待处理请求。但不是这样,一些ajax请求发送带有旧令牌的API请求,因为尚未获得新令牌,并且新令牌的请求正在进行中。
我想要一种方法来阻止此请求,直到无法获得新令牌。另外,我使用了第三方javascript库,所以我不能将async设置为false,因为这会损害系统的性能。
更新
通过添加以下逻辑解决了该问题。希望这可以帮助别人。
$.ajaxPrefilter(function (opts, originalOpts, jqXHR) {
// you could pass this option in on a "retry" so that it doesn't
// get all recursive on you.
if (opts.refreshRequest) {
return;
}
// our own deferred object to handle done/fail callbacks
var dfd = $.Deferred();
// if the request works, return normally
jqXHR.done(dfd.resolve);
// if the request fails, do something else
// yet still resolve
jqXHR.fail(function () {
var args = Array.prototype.slice.call(arguments);
if (jqXHR.status === 401) {
$.ajax({
url: BASEPATH.APIPATH + '/Token',
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'
},
method: 'POST',
refreshRequest: true,
error: function () {
// reject with the original 401 data and then redirect to login page.
setTimeout(function () {
window.location = "/Login";
}, 4000);
dfd.rejectWith(jqXHR, args);
},
success: function (res) {
// retry with a copied originalOpts with new access token.
var newOpts = $.extend({}, originalOpts, { url: opts.url });
// pass this one on to our deferred pass or fail.
$.ajax(newOpts).then(dfd.resolve, dfd.reject);
}
});
} else {
dfd.rejectWith(jqXHR, args);
}
})
return dfd.promise(jqXHR);});
答案 0 :(得分:-1)
使用以下代码使用javascript达到特定时间,直到服务器生成新令牌。
function wait(ms) {
var start = new Date().getTime();
var end = start;
while (end < start + ms) {
end = new Date().getTime();
}
}
等待(5000); // 5秒
在等待功能中,您可以指定服务器生成令牌所用的时间。请投票,如果它会帮助你。