如何使用jQuery从ajaxPreFilter设置ajax请求头



突然头疼起来。我正在尝试设置一个ajaxPreFilter,以便在每次请求之前不断刷新API令牌。

除了使用API令牌实际设置请求头之外,我已经构建了整个结构,并且一切正常(包括刷新令牌(。

var currentRequests = {};
$.ajaxPrefilter(function( options, originalOptions, jqXHR ) {

//don't do the prefilter code for the refresh_token function and login function
if(options.url == 'API_URL/api/auth/refresh_token' || options.url == 'API_URL/api/auth/login') {
return;
}
successCallback = function(token)
{
jqXHR.setRequestHeader("X-Api-Token", token);
};
errorCallback = function() {
console.error("Could not refresh token, aborting Ajax call to " + options.url);
currentRequests[options.url].abort();
};
check_token_expiry(successCallback, errorCallback);
});
function check_token_expiry(successCallback, errorCallback)
{
current_api_token               = localStorage.getItem("api_token");
current_refresh_token           = localStorage.getItem("refresh_token");
current_api_token_expiry        = localStorage.getItem("api_token_expiry");
current_refresh_token_expiry    = localStorage.getItem("refresh_token_expiry");
time_now                        = Math.floor(Date.now() / 1000);
if(current_refresh_token_expiry > time_now)
{
$.ajax({
type: 'POST',
url: "API_URL/api/auth/refresh_token",
data: "refresh_token=" + current_refresh_token
}).done(function(data) {
if(data.status == 'success') {
localStorage.setItem("api_token", data.token);
localStorage.setItem("refresh_token", data.refresh_token);
localStorage.setItem("api_token_expiry", data.token_expiry);
localStorage.setItem("refresh_token_expiry", data.refresh_token_expiry);
successCallback(data.token);
}
}).fail(function(data) {
errorCallback(data);
});
}
else
{
window.location.href = "login.html";
}
}

我认为我的问题在于successCallback函数,但不确定如何将RequestHeader应用于每个ajax调用。我试过直接在调用中使用localStorage.getItem("api_token"(,但它仍然会获取以前的值,这也是我最初开始使用beforeSend((的原因;

任何帮助都将不胜感激。

如果它正在检索以前的值localstorage是因为它在进行刷新调用之前没有设置值吗?

像这样的东西能用吗

$("body").bind("ajaxSend", function(elm, xhr, s){
if (s.type == "POST") {
xhr.setRequestHeader('....', '....');
}
});

出于兴趣,你为什么不能使用beforeSend?

最新更新