AJAX interdomaine n’envoie pas d’en-tête X-Requested-With

Créez un service Web sur http://www.a.com/service.asmx et envoyez-lui une requête ajax inter-domaines à partir de http://www.b.com . Vérifiez les en-têtes dans Firebug , ou dans les en-têtes HTTP en direct , ou tout autre plug-in souhaité.

Il n’y a aucune trace du champ d’en-tête HTTP avec X-Requested-With parmi les en-têtes de requête.

Toutefois, si vous envoyez une requête ajax au même service à partir du même domaine (par exemple, http://www.a.com/about ), vous verrez ce champ d’en-tête.

Pourquoi le champ d’en tête X-Requested-With est -il omis pour les requêtes ajax interdomaine?

Mise à jour: Je sais que les appels JSONP ne sont pas des appels AJAX dans la nature. Ainsi, vous ne verrez aucun champ d’en tête X-Requested-With dans les appels JSONP.

Si vous utilisez jQuery pour faire votre requête ajax, il n’enverra pas l’en-tête X-Requested-With (HTTP_X_REQUESTED_WITH) = XMLHttpRequest, car il s’agit d’un domaine croisé. Mais il y a 2 façons de résoudre ce problème et d’envoyer l’en-tête:

Option 1) Définissez manuellement l’en-tête dans l’appel ajax:

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

Option 2) Dites à jQuery de ne pas utiliser les valeurs par défaut des domaines croisés. Il conservera donc l’en-tête X-Requested-With dans la requête ajax:

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

Mais avec cela, le serveur doit autoriser ces en-têtes, le serveur doit alors imprimer ces en-têtes:

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

La première ligne ci-dessus évitera l’erreur “L’origine n’est pas autorisée par Access-Control-Allow-Origin.”
La seconde ligne évitera l’erreur “Le champ d’en-tête de requête X-Requested-With n’est pas autorisé par Access-Control-Allow-Headers.”