La croix-Origine de la Demande de Partage de la SCRO (A. K. A. de la Croix-Domaine requête AJAX) est un problème que la plupart des développeurs web peuvent rencontrer, selon la Même Origine Politique, les navigateurs restreindre client JavaScript dans un sandbox de sécurité, généralement JS ne peut pas communiquer directement avec un serveur distant à partir d'un domaine différent. Dans le passé, les développeurs ont créé plusieurs manières délicates à réaliser inter-Domaine de la demande de ressource, le plus souvent à l'aide de moyens sont:
- Utiliser Flash/Silverlight ou côté serveur comme un "proxy" pour communiquer
avec la télécommande.
- JSON Avec un Rembourrage (JSONP).
- Intègre serveur distant dans un iframe et de communiquer au travers du fragment ou de la fenêtre.nom, reportez-vous ici.
Ces manières délicates ont plus ou moins certaines questions, par exemple JSONP pourrait résulter en un trou de sécurité si les développeurs simplement "eval", et n ° 3 ci-dessus, bien que cela fonctionne, les deux domaines doivent construire stricte contrat entre les uns des autres, ni souple, ni élégant à mon humble avis:)
Le W3C avait introduit Cross-Origin Resource sharing (SCRO) comme une solution standard pour fournir un coffre-fort, souple et d'une norme recommandée façon de résoudre ce problème.
Le Mécanisme
À partir d'un haut niveau, nous pouvons simplement juger de la SCRO est un contrat entre le client appel AJAX à partir d'Un domaine et d'une page hébergée sur le domaine B, une ferme typique de la Croix-Origine de requête/réponse serait:
DomainA-têtes de la requête 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
DomainB en-têtes de réponse
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é ci-dessus ont été le kernel faits, "Origine" en-tête de requête "indique l'endroit où la croix-origine de la demande ou de contrôle en amont la demande provient de", le "Access-Control-Allow-Origin" en-tête de réponse indique cette page permet à distance de la demande de DomainA (si la valeur est * permet d'indiquer les demandes à distance à partir de n'importe quel domaine).
Comme je l'ai mentionné ci-dessus, W3 navigateur recommandé de réaliser uncontrôle en amont de la demande" avant de soumettre la réalité de la Croix-Origine de la requête HTTP, en un mot c'est un HTTP "OPTIONS", à la demande:
OPTIONS DomainB.com/foo.aspx HTTP/1.1
Si foo.aspx prend en charge les OPTIONS HTTP verbe, il risque de retourner la 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
Seulement si la réponse contient "Access-Control-Allow-Origin" ET sa valeur est "*" ou contiennent le domaine qui a présenté la SCRO demande, par la satisfaction de ce mandtory condition navigateur de soumettre la demande de domaines et de mettre en cache le résultat en "contrôle en amont-Résultat-Cache".
J'ai blogué à propos de la SCRO il y a trois ans: http://wayneye.com/Blog/Ajax-Cross-Origin-HTTP-request