有没有办法删除setRequestHeader()设置的Ajax头?

时间:2013-08-28 14:53:42

标签: javascript ajax jquery

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

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

我似乎有3个选择:

  1. 找到一种方法来删除$ .ajax()的beforeSend函数中的XID标题,我已经确认在ajaxPrefilter()函数之后调用它。
  2. 完全放弃使用$ .ajax()并自己编写Ajax内容。
  3. 让$ .ajax()指向系统的后端,该后端接受自定义XID标头,并通过cURL向第三方网站执行请求。
  4. 选项#1是首选,如果有一个简单的方法,因为它将是最干净和最快的路线。只是无法弄清楚如何

    我试过像这样覆盖它,但它不起作用:

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

    有什么想法吗?

5 个答案:

答案 0 :(得分:4)

我意识到这是一个老线程,但它仍然是一个问题!希望以下内容能够帮助我们为其他人解决问题。

将标题设置为null / undefined / ""后,将其删除,它仍然会发送标题但是无价值或"未定义"或" null"。这可能永远不会是你想要的,在我们的例子中,当它是授权标题时完全固定SSO。

我们提出的解决方案依赖于@ marlar的建议(谢谢)和jQuery的另一个缺点:你只能有一个beforeSend()钩子,而且任何新的钩子都会取代上一个。如果您在特定beforeSend()请求中提供$.ajax(),它似乎也是如此 - 它将覆盖$.ajaxSetup()中的任何默认值。通过这样做,您可以防止默认挂钩设置标头。 (它不是100%理想,因为默认beforeSend()中可能还有其他事情会发生,但不会发生,但是嘿)。

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

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

你不能对prefilter()做同样的事情,但我认为beforeSend()是更常见的做法。

答案 1 :(得分:2)

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

请参阅http://api.jquery.com/jQuery.ajaxSetup/

答案 2 :(得分:1)

我们无法使用const mongoose = require("mongoose"); const gLogSchema = mongoose.Schema({ _id: mongoose.Schema.Types.ObjectId, GiveawayHost: String, GiveawayHostID: String, Prize: String, WinnerUsername: String, WinnerUsernameID: String, time: String }); module.exports = mongoose.model("GiveawayLogs", gLogSchema) 删除标头,因为已经传递到beforeSend()的数据我们只能修改标头。

但是今天,2019年,您可以使用XMLHttpRequest删除不需要的(非标准)标题。

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

答案 3 :(得分:0)

重叠似乎不起作用,但有一个简单的解决方法。

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

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

但是当我不想发送"授权"标题我只是在任何请求发出之前将全局 sendToken 传递给 false 。完成所有请求后,我只需将其设置为 true ...

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

它对我有用。

答案 4 :(得分:0)

这将删除带有$ .ajaxSetup()的标头集。我想它也适用于beforeSend()。

delete $.ajaxSettings.headers["custom-xid-header"]