【问题标题】:jQuery ajaxPrefilter fires after request is sent发送请求后触发 jQuery ajaxPrefilter
【发布时间】:2019-03-21 11:55:38
【问题描述】:

根据jQuery.ajaxPrefilter() 的描述,它应该在请求发送到$.ajax() 之前被触发,但从我在项目中看到的情况来看,首先调用服务器API 端点,然后调用@987654323 @ 函数被调用,此时进行任何更改都为时已晚。

我可能在这里遗漏了一些东西,但我没有看到它......

我的注册如下所示:

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

【问题讨论】:

    标签: jquery ajax jquery-3


    【解决方案1】:

    这种方式应该可行(在$.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);
          }
        }
      }
    });
    

    【讨论】:

    • 你在哪里使用$.ajaxPrefilter?我最初想使用它的原因也是首先检查请求标头是否包含授权令牌,如果没有,则添加它。我不需要使用预过滤器,但我很好奇为什么它没有像宣传的那样工作。
    • 此答案中的代码只是替换了您原始帖子中的jqXHR.setRequestHeader('Authorization', 'Bearer ' + jwt);,在$.ajaxPrefilter 内。我知道我实际上并没有帮助解释为什么改变 jqXHR 本身(至少是它的标题)没有任何效果。
    • 哦,对了,太晚了,我什至无法阅读...确实没有帮助,因为在设置标头时,请求已经到达服务器,这违背了设置的目的首先是标题:)
    • 我不确定我是否遵循。这确实在发出请求之前更改了标头,这与开头帖子中的代码相反。不过我可能误解了一些东西:)
    • 我已经编辑了我的答案,以防万一它更清楚。
    猜你喜欢
    • 2013-05-06
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 2016-07-25
    • 1970-01-01
    相关资源
    最近更新 更多