Le partage de ressources inter-origines - CORS
(demande AKAX inter-domaines AJAX) est un problème que la plupart des développeurs Web peuvent rencontrer, selon la même politique d'origine, les navigateurs restreignent le JavaScript du client dans un sandbox de sécurité, généralement JS ne peut pas communiquer directement avec un serveur distant d'un domaine différent. Dans le passé, les développeurs ont créé de nombreuses méthodes délicates pour répondre aux demandes de ressources interdomaines, les plus courantes étant les suivantes:
- Utilisez Flash / Silverlight ou côté serveur comme «proxy» pour communiquer avec la télécommande.
- JSON avec rembourrage ( JSONP ).
- Incorpore un serveur distant dans un iframe et communique via un fragment ou un nom de fenêtre, voir ici .
Ces méthodes délicates ont plus ou moins des problèmes, par exemple JSONP pourrait entraîner une faille de sécurité si les développeurs "évaluent" simplement, et # 3 ci-dessus, bien que cela fonctionne, les deux domaines doivent établir un contrat strict entre eux, il n'est ni flexible ni élégant A MON HUMBLE AVIS:)
Le W3C a introduit le partage de ressources d'origine croisée (CORS) en tant que solution standard pour fournir un moyen sûr, flexible et recommandé de résoudre ce problème.
Le mécanisme
D'un niveau élevé, nous pouvons simplement considérer que CORS est un contrat entre un appel AJAX client du domaine A et une page hébergée sur le domaine B, une demande / réponse typique d'origine croisée serait:
En-têtes de demande DomainA AJAX
Host DomainB.com
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,application/json
Accept-Language en-us;
Accept-Encoding gzip, deflate
Keep-Alive 115
Origin http://DomainA.com
En-têtes de réponse DomainB
Cache-Control private
Content-Type application/json; charset=utf-8
Access-Control-Allow-Origin DomainA.com
Content-Length 87
Proxy-Connection Keep-Alive
Connection Keep-Alive
Les parties bleues que j'ai marquées ci-dessus étaient les faits fondamentaux, l'en-tête de demande "Origine" indique où la demande d'origine croisée ou la demande de contrôle en amont provient ", l'en-tête de réponse" Contrôle d'accès-Autoriser-Origine "indique que cette page autorise la demande à distance depuis DomainA (si la valeur est * indiquer autorise les requêtes distantes de n'importe quel domaine).
Comme je l'ai mentionné ci-dessus, W3 a recommandé au navigateur d'implémenter une " demande de contrôle en amont " avant de soumettre la demande HTTP réellement d'origine croisée, en un mot, il s'agit d'une OPTIONS
demande HTTP :
OPTIONS DomainB.com/foo.aspx HTTP/1.1
Si foo.aspx prend en charge le verbe HTTP OPTIONS, il peut renvoyer une réponse comme ci-dessous:
HTTP/1.1 200 OK
Date: Wed, 01 Mar 2011 15:38:19 GMT
Access-Control-Allow-Origin: http://DomainA.com
Access-Control-Allow-Methods: POST, GET, OPTIONS, HEAD
Access-Control-Allow-Headers: X-Requested-With
Access-Control-Max-Age: 1728000
Connection: Keep-Alive
Content-Type: application/json
Ce n'est que si la réponse contient "Access-Control-Allow-Origin" ET que sa valeur est "*" ou contient le domaine qui a soumis la demande CORS, en satisfaisant à cette condition obligatoire que le navigateur soumettra la demande Cross-Domain réelle et mettra en cache le résultat dans " Preflight-Result-Cache ".
J'ai blogué sur CORS il y a trois ans: demande HTTP AJAX Cross-Origin
http://siteA/MyCode.js
.