根据jQuery.ajaxPrefilter()的描述,应该在请求发送到$.ajax()
之前被触发,但是从我在项目中看到的情况来看,首先调用了服务器API端点,然后调用ajaxPrefilter
函数,此时进行任何更改为时已晚。
我可能在这里丢失了一些东西,但我看不到...
这是我的注册内容:
$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
if (options.url.startsWith('api') || options.url.startsWith('/api')) {
if (options.headers === undefined) {
options.headers = {};
}
if (!options.headers.Authorization) {
var jwt = sessionStorage.getItem('accessToken');
jqXHR.setRequestHeader('Authorization', 'Bearer ' + jwt);
}
}
});
我完全知道我可以使用beforeSend
设置标题,但是我想通过首先检查标题是否存在,如果不存在,然后添加它以及唯一的读取方式来进行设置据我了解,仅在使用ajaxPrefilter
之前发送请求标头。
我可能最终会使用beforeSend
,但是我很好奇为什么它不能像文档中描述的那样起作用?也许我不完全了解它的工作原理...
我正在使用jQuery 3.3.1版本。
编辑:
设置async: false
似乎可以解决问题,但这对我来说似乎是jQuery中的错误。
编辑2:
我想我可能在某个地方有错误,因为现在上面的代码可以工作了。我不知道这个错误可能在哪里,因为通过查看我的git更改根本看不出来,但是现在可以使用...
答案 0 :(得分:0)
这种方法应该可以工作(在$.ajaxPrefilter
中,根据您的情况):
options.beforeSend = function (xhr) {
xhr.setRequestHeader('Authorization', 'Bearer ' + jwt);
}
但是,老实说,我不确定您为什么不能只将它们设置为jqXHR
。在我看来,这也是合乎逻辑的。
您的代码变为:
$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
if (options.url.startsWith('api') || options.url.startsWith('/api')) {
if (options.headers === undefined) {
options.headers = {};
}
if (!options.headers.Authorization) {
var jwt = sessionStorage.getItem('accessToken');
options.beforeSend = function(xhr) {
xhr.setRequestHeader('Authorization', 'Bearer ' + jwt);
}
}
}
});