发送请求后,jQuery ajaxPrefilter将触发

时间:2018-10-16 21:11:01

标签: jquery ajax jquery-3

根据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更改根本看不出来,但是现在可以使用...

1 个答案:

答案 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);
      }
    }
  }
});