Condivisione delle risorse tra origini - CORS
(richiesta AJAX tra domini AKA) è un problema che la maggior parte degli sviluppatori Web potrebbe riscontrare, secondo la stessa politica di origine, i browser limitano JavaScript client in una sandbox di sicurezza, di solito JS non può comunicare direttamente con un server remoto da un dominio diverso. In passato gli sviluppatori hanno creato molti modi complicati per ottenere la richiesta di risorse tra domini, più comunemente usando modi sono:
- Utilizzare Flash / Silverlight o lato server come "proxy" per comunicare con il telecomando.
- JSON con imbottitura ( JSONP ).
- Incorpora il server remoto in un iframe e comunica tramite frammento o nome_finestra, fare riferimento qui .
Quei modi complicati hanno più o meno alcuni problemi, ad esempio JSONP potrebbe comportare un buco nella sicurezza se gli sviluppatori semplicemente lo "valutano", e il n. 3 sopra, sebbene funzioni, entrambi i domini dovrebbero costruire un rigoroso contratto tra loro, né flessibile né elegante A PARER MIO:)
Il W3C aveva introdotto la condivisione delle risorse incrociate (CORS) come soluzione standard per fornire un modo standard sicuro, flessibile e raccomandato per risolvere questo problema.
Il meccanismo
Da un livello elevato possiamo semplicemente ritenere che CORS sia un contratto tra la chiamata AJAX del client dal dominio A e una pagina ospitata sul dominio B, una tipica richiesta / risposta Cross-Origin sarebbe:
Dominio A Intestazioni richieste 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
Intestazioni di risposta 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
Le parti blu che ho segnato sopra erano i fatti di Kernal, l'intestazione della richiesta "Origine" indica da dove proviene la richiesta di origine incrociata o la richiesta di verifica preliminare ", l'intestazione della risposta" Accesso-Controllo-Consenti-Origine "indica che questa pagina consente la richiesta remota da Dominio A (se il valore è * indica che consente le richieste remote da qualsiasi dominio).
Come accennato in precedenza, W3 ha raccomandato al browser di implementare una " richiesta di verifica preliminare " prima di inviare la richiesta HTTP Cross-Origin, in breve è una OPTIONS
richiesta HTTP :
OPTIONS DomainB.com/foo.aspx HTTP/1.1
Se foo.aspx supporta il verbo HTTP OPTIONS, potrebbe restituire una risposta come di seguito:
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
Solo se la risposta contiene "Access-Control-Allow-Origin" E il suo valore è "*" o contiene il dominio che ha inviato la richiesta CORS, soddisfacendo questa condizione obbligatoria il browser invierà la richiesta effettiva tra domini e memorizzerà nella cache il risultato in " Preflight-Result-Cache ".
Ho scritto un blog su CORS tre anni fa: richiesta HTTP AJAX Cross-Origin
http://siteA/MyCode.js
.