Решение для удаления заголовка в jQuery, предложенное @vamp, находится на правильном пути, но, как утверждают другие, это все равно приведет к отправке пустого заголовка X-Requested-With.
beforeSendобратный вызов получает объект XHR jQuery (jqXHR), а не реальный объект XMLHttpRequest (xhr), который даже не создается до тех пор, пока не будет вызван beforeSend.
Метод setRequestHeader в jqXHR добавляет заголовкиобъект, который затем повторяется с использованием метода xhr с тем же именем, сразу после добавления записи X-Requested-With к объекту заголовков.
Вот часть в 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, которые нельзя сбрасывать.
Чтобы предотвратить отправку заголовка X-Requested-With с jQuery.ajax:
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...
});