Подтвердить что ты не робот

Могу ли я удалить заголовок X-Requested-With из ajax-запросов?

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

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

Спасибо

Заголовок

выглядит следующим образом:

X-Requested-With XMLHttpRequest
4b9b3361

Ответ 1

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

Нет, Greasemonkey 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...

Ответ 2

Решение для удаления заголовка в jQuery, предложенное @vamp, находится на правильном пути, но, как утверждают другие, все равно будет отправлен пустой отправленный X-запрошенный заголовок.

Обратный вызов 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, но это может быть не нужное решение). Затем он сразу устанавливает хрл заголовки, которые не могут быть отменены.


Чтобы предотвратить отправку заголовка X-Requested-With с помощью jQuery.ajax:

jQuery.ajax предоставляет параметр xhr, который переопределяет встроенный метод jQuery factory для создания объекта XMLHttpRequest. Упаковывая этот метод factory, а затем обертывая собственный метод setRequestHeader для браузера, вызов из jQuery для установки заголовка X-Requested-With можно игнорировать.

jQuery.ajax({

    url: yourAjaxUrl,

    // 'xhr' option overrides jQuery 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 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...

});

Ответ 3

почему бы и нет? попробуйте:

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

Удачи!

Ответ 4

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

server.php

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

client.js

$.ajax({ url: 'server.php', crossDomain: true }).success(function(r){document.write(r)})

Ответ 5

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

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

Ответ 6

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

$.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' );
    }
  }
});