【发布时间】:2020-05-26 17:00:00
【问题描述】:
我有一个带有 refreshToken 的 jwt 身份验证系统。 每 5 分钟,客户端浏览器必须使用保存在 localStorage 中的 refreshToken 请求一个新的 accessToken。
为此,我在每次 AJAX 调用中都使用了 before send 函数。
$.ajaxSetup({
beforeSend: addAuthHeader,
});
function addAuthHeader(xhr) {
if(Math.round(new Date() / 1000) >= sessionStorage.getItem('jwt_exp')) {
console.log('JWT expired. Refreshing now...');
$.ajax({
method: 'POST',
url: '/auth/token/refresh',
beforeSend: function (xhr) { },
data: { token: localStorage.getItem('refreshToken') },
// TODO: FIXME: Synchronous are deprected
async: false,
}).done(function (data) {
sessionStorage.setItem('jwt', data.accessToken);
sessionStorage.setItem('jwt_exp', data.exp);
xhr.setRequestHeader('Authorization', 'Bearer ' + data.accessToken);
console.log('Authorization', 'Bearer ' + data.accessToken);
});
} else {
xhr.setRequestHeader('Authorization', 'Bearer ' + sessionStorage.getItem('jwt'));
console.log('Authorization', 'Bearer ' + sessionStorage.getItem('jwt'));
}
}
如您所见,我现在使用同步请求。 但这些已被弃用:
[Deprecation] Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
有什么我可以做我想做的异步操作吗?
运行第二个 ajax 调用不会更改 Headers => beforeSend 不会等到一切都完成
【问题讨论】:
标签: javascript jquery ajax asynchronous xmlhttprequest