web-dev-qa-db-fra.com

Comment envoyer un en-tête personnalisé dans un XMLHttpRequest inter-domaines (CORS)?

J'essaie d'envoyer une demande CORS pour une charge utile JSON. Je contrôle à la fois le serveur et le client.

Je suis le long ici: https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control

Le serveur possède un en-tête personnalisé qui doit être envoyé avec chaque demande. Cet en-tête personnalisé rend donc la demande "pas simple" et donc la demande doit être contrôlée en amont avec une demande OPTIONS.

Je peux voir jquery faire la demande OPTIONS, mais il n'envoie pas l'en-tête personnalisé.

Méthodes que j'ai essayées:

Dans les deux cas, le navigateur n'envoie pas l'en-tête personnalisé.

J'utilise FF 17.0.1, jquery 1.8.3.

23
mooreds

Votre problème n'est pas avec jquery, c'est dans comment CORS fonctionne . Votre rappel beforeSend fonctionnait probablement comme prévu ... mais les navigateurs n'enverront pas d'en-têtes personnalisés dans les demandes de contrôle en amont, quoi qu'il arrive. C'est par conception; le but de la demande de contrôle en amont est de déterminer quelles informations l'agent utilisateur (navigateur) est autorisé à envoyer au-delà des éléments "simples" définis dans la spécification CORS. Ainsi, pour l'agent utilisateur d'envoyer des données non simples (telles que votre en-tête personnalisé) dans le cadre de la demande de contrôle en amont est voué à l'échec.

Pour demander à l'agent utilisateur d'inclure votre en-tête personnalisé dans la demande CORS réelle, incluez un Access-Control-Allow-Headers header dans votre réponse de contrôle en amont. Il convient de noter que si vous n'êtes pas trop préoccupé par les en-têtes que l'agent utilisateur transmet, je pense que vous pouvez simplement renvoyer la valeur de Access-Control-Request-Headers champ d'en-tête de demande comme valeur de Access-Control-Allow-Headers vous envoyez la réponse.

Vous pouvez également inclure certains des autres Access-Control-Allow-* en-têtes définis dans section syntaxique de la spécification .

Voir aussi CORS - Comment faire un 'contrôle en amont' d'une requête http?

Voir aussi exemple de contrôle en amont CORS de Mozilla , qui montre ces en-têtes en action.

32
broofa