Intercambio de recursos de origen cruzado: CORS
(solicitud AKA de dominio cruzado AJAX) es un problema que la mayoría de los desarrolladores web pueden encontrar, de acuerdo con la Política de Mismo Origen, los navegadores restringen el JavaScript del cliente en un entorno limitado de seguridad, generalmente JS no puede comunicarse directamente con un servidor remoto de un dominio diferente. En el pasado, los desarrolladores crearon muchas formas difíciles de lograr la solicitud de recursos entre dominios.
- Utilice Flash / Silverlight o el lado del servidor como "proxy" para comunicarse con el control remoto.
- JSON con relleno ( JSONP ).
- Incruste el servidor remoto en un iframe y comuníquese a través de fragment o window.name, consulte aquí .
Esas formas complicadas tienen más o menos algunos problemas, por ejemplo, JSONP podría resultar en un agujero de seguridad si los desarrolladores simplemente lo "evalúan", y el # 3 anterior, aunque funciona, ambos dominios deben construir un contrato estricto entre sí, ni flexible ni elegante. EN MI HUMILDE OPINIÓN:)
El W3C había introducido Cross-Origin Resource Sharing (CORS) como una solución estándar para proporcionar una forma estándar segura, flexible y recomendada para resolver este problema.
El mecanismo
Desde un alto nivel, simplemente podemos considerar que CORS es un contrato entre la llamada AJAX del cliente del dominio A y una página alojada en el dominio B, una solicitud / respuesta típica de origen cruzado sería:
Dominio Un encabezado de solicitud 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
Encabezados de respuesta de 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
Las partes azules que marqué arriba eran los hechos del núcleo, el encabezado de solicitud "Origen" indica dónde se origina la solicitud de origen cruzado o la solicitud de verificación previa ", el encabezado de respuesta" Acceso-Control-Permitir-Origen "indica que esta página permite la solicitud remota de El dominio A (si el valor es * indica permite solicitudes remotas de cualquier dominio).
Como mencioné anteriormente, W3 recomendó que el navegador implementara una " solicitud de verificación previa " antes de enviar la solicitud HTTP Cross-Origin, en pocas palabras, es una OPTIONS
solicitud HTTP :
OPTIONS DomainB.com/foo.aspx HTTP/1.1
Si foo.aspx admite el verbo HTTP OPTIONS, podría devolver una respuesta como la siguiente:
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 si la respuesta contiene "Access-Control-Allow-Origin" Y su valor es "*" o si contiene el dominio que envió la solicitud CORS, al satisfacer esta condición obligatoria, el navegador enviará la solicitud real entre dominios y almacenará en caché el resultado en " Preflight-Result-Cache ".
Hace un blog escribí sobre CORS hace tres años: solicitud HTTP AJAX Cross-Origin
http://siteA/MyCode.js
.