@vamp 提出的在 jQuery 中删除标头的解决方案是正确的,但正如其他人所说,它仍然会导致发送一个空的 X-Requested-With 标头。
beforeSend 回调接收 jQuery 的 XHR 对象 (jqXHR),而不是实际的 XMLHttpRequest 对象 (xhr),它甚至在调用 beforeSend 之后才被实例化。
jqXHR 中的 setRequestHeader 方法将标头添加到对象中,然后在将 X-Requested-With 条目添加到标头对象之后使用同名的 xhr 方法进行迭代。
这是 jQuery 中发生这种情况的部分:
if ( !options.crossDomain && !headers["X-Requested-With"] ) {
headers["X-Requested-With"] = "XMLHttpRequest";
}
for ( i in headers ) {
xhr.setRequestHeader( i, headers[ i ] );
}
这会导致问题:如果您不指定 X-Requested-With 标头,那么 jQuery 将(除非 crossDomain 设置评估为 false,但这可能不是所需的解决方案)。然后它立即设置不能取消设置的 xhr 标头。
防止使用 jQuery.ajax 发送 X-Requested-With 标头:
jQuery.ajax 提供了一个设置 xhr,它覆盖了 jQuery 用于创建 XMLHttpRequest 对象的内置工厂方法。通过包装这个工厂方法,然后包装浏览器原生的 setRequestHeader 方法,可以忽略 jQuery 设置 X-Requested-With 标头的调用。
jQuery.ajax({
url: yourAjaxUrl,
// 'xhr' option overrides jQuery's default
// factory for the XMLHttpRequest object.
// Use either in global settings or individual call as shown here.
xhr: function() {
// Get new xhr object using default factory
var xhr = jQuery.ajaxSettings.xhr();
// Copy the browser's native setRequestHeader method
var setRequestHeader = xhr.setRequestHeader;
// Replace with a wrapper
xhr.setRequestHeader = function(name, value) {
// Ignore the X-Requested-With header
if (name == 'X-Requested-With') return;
// Otherwise call the native setRequestHeader method
// Note: setRequestHeader requires its 'this' to be the xhr object,
// which is what 'this' is here when executed.
setRequestHeader.call(this, name, value);
}
// pass it on to jQuery
return xhr;
},
success: function(data, textStatus, jqXHR) {
// response from request without X-Requested-With header!
}
// etc...
});