0

根据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 更改它根本不明显,但它现在可以工作......

4

1 回答 1

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);
      }
    }
  }
});
于 2018-10-16T21:45:46.430 回答