2011-11-17 17 views
35

Creare un servizio Web su http://www.a.com/service.asmx e inviare una richiesta ajax tra domini da http : //www.b.com. Controlla le intestazioni in Firebug o in intestazioni HTTP in tempo reale o qualsiasi altro plug-in desiderato.Cross-Domain AJAX non invia X-Requested-With header

Non c'è traccia del campo X-Requested-With HTTP tra le intestazioni delle richieste.

Tuttavia, se si invia una richiesta Ajax allo stesso servizio dallo stesso dominio (ad esempio, ad esempio http://www.a.com/about), verrà visualizzato il campo di intestazione.

Perché il campo dell'intestazione X-Requested-With è omesso per le richieste di ajax tra domini diversi?

Aggiornamento: So che le chiamate JSONP non sono chiamate AJAX in natura. Pertanto non vedrai alcun campo X-Requested-With nelle chiamate JSONP.

risposta

60

Se si utilizza jQuery per eseguire la richiesta ajax, non invierà l'intestazione X-Requested-With (HTTP_X_REQUESTED_WITH) = XMLHttpRequest, perché è un dominio incrociato. Ma ci sono 2 modi per risolvere questo e inviare l'intestazione:

opzione 1) Impostare manualmente l'intestazione nella chiamata AJAX:

$.ajax({ 
    url: "http://your-url...", 
headers: {'X-Requested-With': 'XMLHttpRequest'} 
}); 

opzione 2) Dillo jQuery non utilizzare valori predefiniti del dominio croce, così che manterrà la X-richiesta-con intestazione nella richiesta Ajax:

$.ajax({ 
    url: "http://your-url...", 
crossDomain: false 
}); 

Ma con questo, il server deve consentire a tali intestazioni, il server ha la necessità di stampare le intestazioni:

print "Access-Control-Allow-Origin: *\n"; 
print "Access-Control-Allow-Headers: X-Requested-With, Content-Type\n"; 

La prima riga sopra eviterà l'errore "Origine non consentita da Access-Control-Allow-Origin."
La seconda riga eviterà l'errore "Il campo di intestazione richiesta X-Requested-With non è consentito da Access-Control-Allow-Headers."

+16

La prima riga consente inoltre a tutti di eseguire richieste di domini incrociati sul server che non è una buona idea in generale. L'intestazione "Access-Control-Allow-Origin" dovrebbe essere impostata dinamicamente controllando l'intestazione "Origin" su una whitelist. –