2010-07-30 4 views
22

Quería saber si alguien ha tenido experiencia en tratar de eliminar el encabezado 'X-Requested-With' de la solicitud ajax hecha por jquery (o JS simple). ¿Es posible?¿Puedo eliminar el encabezado X-Requerido-Con de las solicitudes ajax?

segunda parte: ¿sabes si Grease Monkey's ajax solicita establecer este encabezado?

Gracias

cabecera se ve así:

X-Requested-With XMLHttpRequest 
+0

Creo que una de las ventajas de tener este conjunto de cabecera es para que pueda comprobar en el script del lado del servidor y determinar si era de hecho una petición AJAX y por lo tanto cómo manejarlo? – MrWhite

+2

w3d: y la desventaja de tener al lado del servidor cuando hizo una solicitud de Ajax es que pueden evitar que lo haga en su script de GM – mkoryak

Respuesta

3

"segunda parte: ¿Sabe usted si ajax del mono de grasa las solicitudes establecen este encabezado? "

No, Greasemonkey's GM_xmlhttpRequest() no establece este encabezado (aunque ciertamente puede agregarlo).

La solicitud predeterminada emitida por GM_xmlhttpRequest() tiene el aspecto de una solicitud de navegador normal.
Por ejemplo:

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

Parece que esto a mi analizador de paquetes:

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... 
por qué no
6

? intento:

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

buena suerte!

+0

No es que realmente esperara que fuera específico del navegador, pero funcionó bien para mí en Firefox 4, Chrome 10, IE 9 y Opera 11. Por lo que estoy necesitando, no me importa alterar * todas * las solicitudes de AJAX, pero me pregunto si hay alguna manera de que esto suceda solo para solicitudes específicas. – patridge

+0

¿No puede agregar una devolución de llamada beforeSend a la llamada $ .ajax? – hayavuk

+0

Según la respuesta de @ Marin [en su mayoría idéntica], parece que puedes. En un [jsFiddle de muestra] (http://jsfiddle.net/patridge/amA3W/), elimino el encabezado 'X-Requested-With' y no elimino el encabezado' Referer' (Chrome no lo permitirá) . Para mayor diversión, también armé un [violín con esta versión de todas las solicitudes] (http://jsfiddle.net/patridge/h4Lvp/). – patridge

-3

Usted puede considerar esto:

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

tenga en cuenta que @vamp dio esta respuesta exacta ya que – mkoryak

+2

Si bien la sección 'beforeSend' es idéntica, esta es una forma más granular de eliminar el encabezado (solicitud por solicitud frente a todas las solicitudes como lo hizo @vamp). Dicho esto, probablemente debería haber una aclaración de cómo es diferente en la respuesta para ayudar a quienes buscan este tipo de solución. – patridge

+1

NO funciona. Solo establece el valor del encabezado en una cadena vacía. El encabezado aún se envía. –

5

Para hacer esto con jQuery, establecer su solicitud como entre dominios. Ejemplo:

server.php

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

Client.js

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

Añadiendo 'crossDomain: true' trabajado para mí, gracias! –

+1

Esto funcionó para mí tratando de acceder a la API de Pinterest usando jQuery (ej. Https://api.pinterest.com/v3/pidgets/users/USERNAME/pins/) – Tebbers

18

La solución para la eliminación de la cabecera en jQuery propuesto por @vamp es en el camino correcto, pero como otros han declarado que aún resultará en un encabezado X-Requerido-Con vacío que se envía.

El beforeSend de devolución de llamada recibe objeto XHR de jQuery (jqXHR), más que el objeto real XMLHttpRequest (XHR), que no está incluso instanciada hasta después de beforeSend se llama.

El método setRequestHeader en jqXHR agrega encabezados a un objeto, que luego se itera más tarde utilizando el método xhr del mismo nombre, justo después de agregar la entrada X-Requerido-With al objeto de encabezados.

Aquí está la parte en jQuery, donde esto está sucediendo:

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

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

Lo que nos lleva al problema: Si no se especifica los, evalúa entonces jQuery (a menos de ajuste será el crossdomain X-solicitada-Con cabecera falso, pero esa puede no ser la solución deseada). A continuación, establece inmediatamente los encabezados xhr, que no se pueden deshacer.


Para evitar el envío de los X-solicitada-Con cabecera con jQuery.ajax:

jQuery.ajax proporciona un ajuste, XHR, que anula jQuery incorporado en el método de fábrica para crear el objeto XMLHttpRequest . Al ajustar este método de fábrica y luego ajustar el método setRequestHeader nativo del navegador, se puede ignorar la llamada de jQuery para establecer el encabezado X-Requerido-Con.

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

Tengo un script que hace una solicitud de dominio cruzado, que debería ha sido una simple solicitud de CORS, pero como jQuery agrega automáticamente el encabezado 'X-Requested-With', que se considera personalizado, hizo que el navegador realizara una verificación de verificación previa de CORS innecesaria. Gracias por compartir esto, me estaba volviendo loco tratando de descubrir por qué no podía omitir la verificación previa. – Dooms101

Cuestiones relacionadas