2010-07-30 11 views
22

Volevo sapere se qualcuno ha avuto esperienza con il tentativo di rimuovere l'intestazione 'X-Requested-With' dalla richiesta Aj fatta da jquery (o JS semplice). È possibile?posso rimuovere l'intestazione X-Requested-With dalle richieste di ajax?

seconda parte: sai se le richieste ajax di Grease Monkey impostano questa intestazione?

Grazie

intestazione aspetto:

X-Requested-With XMLHttpRequest 
+0

Credo che uno dei vantaggi di avere questo insieme intestazione è così che si può verificare la presenza di essa nello script lato server e stabilire se si trattava effettivamente di una richiesta AJAX e, pertanto, come gestirlo? – MrWhite

+2

w3d: e lo svantaggio di sapere lato server quando hai fatto una richiesta Ajax è che possono impedirti di farlo nel tuo script GM – mkoryak

risposta

3

"2a parte: fai a sapere se l'Ajax di Grease Monkey le richieste impostano questa intestazione? "

No, Greasemonkey's GM_xmlhttpRequest() non imposta questa intestazione (sebbene sia certamente possibile aggiungerla).

La richiesta predefinita emessa da GM_xmlhttpRequest() è simile a una normale richiesta del browser.
Per esempio:

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

appare come questa nel mio packet sniffer:

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... 
perché non
6

? prova:

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

buona fortuna!

+0

Non che mi aspettassi davvero che fosse specifico del browser, ma ha funzionato bene per me in Firefox 4, Chrome 10, IE 9 e Opera 11. Per quello di cui ho bisogno, non mi dispiace alterare * tutte * le richieste AJAX, ma mi chiedo se c'è un modo per farlo accadere solo per richieste specifiche. – patridge

+0

Non è possibile aggiungere un callback beforeSend alla chiamata $ .ajax stessa? – hayavuk

+0

Secondo la risposta [per lo più identica] di Marin, sembra che tu possa. In un [esempio jsFiddle] (http://jsfiddle.net/patridge/amA3W/), rimuovo l'intestazione 'X-Requested-With' e non riesco a rimuovere l'intestazione' Referer' (Chrome non permetterà che accada) . Per un divertimento in più, ho anche messo insieme un [violino con questa versione di tutte le richieste] (http://jsfiddle.net/patridge/h4Lvp/). – patridge

-3

Si può considerare questo:

$.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

nota che @vamp ha fornito già questa risposta esatta – mkoryak

+2

Mentre la sezione 'beforeSend' è identica, questo è un modo più granulare di rimuovere l'intestazione (per richiesta rispetto a tutte le richieste come @vamp lo ha fatto). Detto questo, ci dovrebbe probabilmente essere un chiarimento su come sia diverso nella risposta per aiutare chi cerca questo tipo di soluzione. – patridge

+1

NON funziona. Imposta solo il valore dell'intestazione su una stringa vuota. L'intestazione è ancora inviata. –

5

Per fare questo con jQuery, impostare la richiesta come cross-domain. Esempio:

server.php

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

Client.js

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

L'aggiunta di 'crossDomain: true' ha funzionato per me, grazie! –

+1

Questo ha funzionato per me cercando di accedere all'API di Pinterest utilizzando jQuery (ad esempio https://api.pinterest.com/v3/pidgets/users/USERNAME/pins/) – Tebbers

18

La soluzione per rimuovere l'intestazione in jQuery proposto dalla @vamp è sulla strada giusta, ma come altri hanno dichiarato che provocherà comunque l'invio di un'intestazione X-Requested-With vuota.

Il beforeSend callback riceve oggetto XHR jQuery (jqXHR), piuttosto che l'oggetto effettivo XMLHttpRequest (XHR), che non è nemmeno istanziata solo dopo beforeSend viene chiamato.

Il metodo setRequestHeader in jqXHR aggiunge intestazioni a un oggetto, che viene quindi iterato in seguito utilizzando il metodo xhr con lo stesso nome, subito dopo l'aggiunta della voce X-Requested-With all'oggetto headers.

ecco la parte in jQuery in cui questo sta accadendo:

if (!options.crossDomain && !headers["X-Requested-With"]) { 
    headers["X-Requested-With"] = "XMLHttpRequest"; 
} 

for (i in headers) { 
    xhr.setRequestHeader(i, headers[ i ]); 
} 

che conduce al problema: se non si specifica i, valuta quindi jQuery (a meno che l'impostazione del crossdomain X-richiesta-Con intestazione falso, ma potrebbe non essere la soluzione desiderata). Quindi imposta immediatamente le intestazioni xhr, che non possono essere disinserite.


Per evitare l'invio del X-richiesta-Con intestazione con jQuery.ajax:

jQuery.ajax offre un ambiente, XHR, che sostituisce jQuery integrato nel metodo factory per creare l'oggetto XMLHttpRequest . Con il wrapping di questo metodo factory e quindi il wrapping del metodo setRequestHeader nativo del browser, la chiamata da jQuery per impostare l'intestazione X-Requested-With può essere ignorata.

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... 

}); 
+0

Ho uno script che effettua una richiesta di dominio incrociato, che dovrebbe è stata una semplice richiesta CORS, ma poiché jQuery aggiunge automaticamente l'intestazione 'X-Requested-With', che è considerata personalizzata, ha fatto in modo che il browser effettuasse un controllo preliminare CORS non necessario. Grazie per aver condiviso questo, stavo impazzendo cercando di capire perché non potevo saltare il preflight. – Dooms101