我正在编写一个JS脚本,该脚本位于一个系统中,该系统现在通过jQuery.ajaxPrefilter()注册的函数中的jqXHR.setRequestHeader()向所有Ajax请求添加自定义XID标头。
在我的脚本中,我需要向第三方站点发出Ajax请求,其Access-Control-Allow-Headers未设置为允许此自定义XID标头。
我似乎有3个选择:
选项#1是首选,如果有一个简单的方法,因为它将是最干净和最快的路线。只是无法弄清楚如何。
我试过像这样覆盖它,但它不起作用:
beforeSend: function(jqXHR, settings) {
jqXHR.setRequestHeader('custom-xid-header', null);
}
有什么想法吗?
答案 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);
}
})
答案 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"]