22

我正在编写一个存在于系统中的 JS 脚本,该系统现在通过 jqXHR.setRequestHeader() 在使用 jQuery.ajaxPrefilter() 注册的函数中向所有 Ajax 请求添加自定义 XID 标头。

在我的脚本中,我需要向第三方站点发出 Ajax 请求,其 Access-Control-Allow-Headers 未设置为允许此自定义 XID 标头。

看来我有3个选择:

  1. 找到一种方法来删除 $.ajax() 的 beforeSend 函数中的 XID 标头,我已经确认它在 ajaxPrefilter() 函数之后被调用。
  2. 完全放弃使用 $.ajax() 并自己编写 Ajax 内容。
  3. 让 $.ajax() 指向接受自定义 XID 标头的系统后端,并通过 cURL 向第三方站点执行请求。

如果有一种简单的方法,则首选选项#1,因为它将是最干净,最快的路线。只是想不通怎么做

我试过像这样覆盖它,但它没有用:

beforeSend: function(jqXHR, settings) {
    jqXHR.setRequestHeader('custom-xid-header', null);
}

有任何想法吗?

4

5 回答 5

5

我意识到这是一个旧线程,但它仍然是一个问题!希望以下内容将帮助其他人解决它,就像它对我们一样。

在设置标头后将标头设置为null//不会undefined删除它,它仍然发送标头但没有值或“未定义”或“空”。这可能永远不是您想要的,在我们的例子中,当它是 Authorization 标头时,完全搞砸了 SSO。""

我们提出的解决方案依赖于@marlar 的建议(谢谢)和 jQuery 的另一个缺陷:你只能有一个beforeSend()钩子,并且任何新的钩子都会替换以前的钩子。beforeSend()如果您在特定请求中提供 a 似乎也是如此$.ajax()- 它会覆盖$.ajaxSetup(). 通过这样做,您可以防止默认挂钩设置标题。(这不是 100% 理想的,因为默认情况下可能会执行其他操作beforeSend(),然后不会发生,但是嘿)。

因此,这可以处理特定请求的静态和动态设置的标头:

if($.ajaxSettings && $.ajaxSettings.headers) {
    delete $.ajaxSettings.headers.Authorization;
}
$.ajax({
    beforeSend: function() {}, // no op
    // ...
});

你不能为 做同样的事情prefilter(),但我认为beforeSend()无论如何都是更常见的方式。

于 2017-03-15T18:02:13.853 回答
2
$.ajaxSetup({
    beforeSend: function(jqXHR, settings) {
        jqXHR.setRequestHeader('custom-xid-header', null);
    }
})

http://api.jquery.com/jQuery.ajaxSetup/

于 2014-08-26T02:25:10.587 回答
2

我们不能使用删除标题,beforeSend()因为已经传递给XMLHttpRequest我们的数据只能修改标题。

但是今天,2019 年,您可以使用jQuery.ajaxPrefilter().

$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
  delete options.headers['custom-xid-header'];
});

$.ajax({
  url: '//httpbin.org/get',
  headers: {
    'custom-xid-header': 'remove me',
    "Accept": "what/ever"
  },
  datatype: 'json',
  success: function(data) {
    console.log(data.headers);
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<!--script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script-->

于 2019-01-02T02:06:10.473 回答
0

覆盖似乎不起作用,但有一个简单的修复。

 $.ajaxSetup({
        beforeSend: function (jqXHR) {
            if (sendToken == true)
                jqXHR.setRequestHeader("Authorization", cookie);
            return true;
        }
    });

检查sendToken变量。它是全球性的。在我的应用程序开始时,我总是将其设置为 true,因为我几乎在任何地方都需要设置标题。

但是,当我不想发送“授权”标头时,我只需将全局sendToken传递给false,然后任何请求都可以发送。完成所有请求后,我只需将其再次设置为true ......

诀窍是 jqXHR 变量是本地的,并且不会每次都保留分配的值。并且覆盖在 ajaxSetup 中设置的当前值不起作用,因为它总是添加新值而不是仅仅替换它。在上面设置条件是我认为最简单有效的方法。

它对我有用。

于 2016-12-03T18:17:35.860 回答
0

这将删除使用 $.ajaxSetup() 设置的标头。我想它也可以与 beforeSend() 一起使用。

delete $.ajaxSettings.headers["custom-xid-header"]
于 2017-02-15T15:00:07.610 回答