я могу удалить заголовок X-Requested-With из запросов AJAX? - PullRequest
24 голосов
/ 30 июля 2010

Я хотел бы знать, имел ли кто-нибудь опыт попытки удалить заголовок 'X-Requested-With' из запроса ajax, сделанного jquery (или обычным JS).возможно ли это?

2-я часть: знаете ли вы, если ajax-запросы Grease Monkey устанавливают этот заголовок?

Спасибо

Заголовок выглядит так:

X-Requested-With XMLHttpRequest

Ответы [ 6 ]

22 голосов
/ 13 июля 2014

Решение для удаления заголовка в 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...

});
7 голосов
/ 09 марта 2011

почему бы и нет? попробовать:

(function(){
    $.ajaxSettings.beforeSend=function(xhr){
        xhr.setRequestHeader('X-Requested-With', {toString: function(){ return ''; }});
    };
})(jQuery);

удачи!

6 голосов
/ 09 марта 2014

Чтобы сделать это с помощью jQuery, установите ваш запрос как междоменный.Пример:

server.php

<?='<pre>'.print_r($_SERVER,1);?>

client.js

$.ajax({ url: 'server.php', crossDomain: true }).success(function(r){document.write(r)})
3 голосов
/ 30 июля 2010

"2-я часть: знаете ли вы, если ajax-запросы Grease Monkey устанавливают этот заголовок?"

Нет, Greasemonkey's GM_xmlhttpRequest() не устанавливает этот заголовокхотя вы, конечно, можете его добавить).

Запрос по умолчанию, выданный GM_xmlhttpRequest(), выглядит как обычный запрос браузера.
Например:

GM_xmlhttpRequest
({
    method:     "GET",
    url:        "http://google.com/",
    onload:     function(response) {alert(response.responseText); }
});

Похожеэто мой анализатор пакетов:

GET / HTTP/1.1
    Request Method: GET
    Request URI: /
    Request Version: HTTP/1.1
Host: google.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: UTF-8,*
Keep-Alive: 115
Connection: keep-alive
Cookie: blah, blah, blah, blah, blah...
0 голосов
/ 17 ноября 2011

Вы можете рассмотреть это:

$.ajax({
  url: 'http://fiddle.jshell.net/favicon.png',
  beforeSend: function( xhr ) {
    xhr.setRequestHeader('X-Requested-With', {toString: function(){ return ''; }});
  },
  success: function( data ) {
    if (console && console.log){
      console.log( 'Got data without the X-Requested-With header' );
    }
  }
});
0 голосов
/ 30 июля 2010

jQuery не предоставляет метод для этого в данный момент, некоторое время назад был тикет , связанный с ошибками Firefox, но вместо того, чтобы сделать это опцией, они исправили ошибкув Firefox.

Если вам интересно, вы можете увидеть, где он добавлен, но вы не можете удалить его без редактирования / переопределения ядра jQuery: http://github.com/jquery/jquery/blob/master/src/ajax.js#L370

...