Compartilhamento de recursos de origem cruzada - CORS
(solicitação AJAX entre domínios da AKA) é um problema que a maioria dos desenvolvedores da Web pode encontrar, de acordo com a mesma política de origem, navegadores restringem o JavaScript do cliente em uma caixa de proteção de segurança, geralmente o JS não pode se comunicar diretamente com um servidor remoto de um domínio diferente. No passado, os desenvolvedores criavam várias maneiras complicadas de obter solicitações de recursos entre domínios, e as formas mais comuns de uso são:
- Use o Flash / Silverlight ou o servidor como um "proxy" para se comunicar com o controle remoto.
- JSON com preenchimento ( JSONP ).
- Incorpora um servidor remoto em um iframe e comunique-se através de fragmento ou window.name, consulte aqui .
Essas maneiras complicadas têm mais ou menos alguns problemas, por exemplo, o JSONP pode resultar em brechas na segurança se os desenvolvedores simplesmente a "avaliarem" e o item 3 acima, embora funcione, ambos os domínios devem criar um contrato estrito entre si, nem flexível nem elegante NA MINHA HUMILDE OPINIÃO:)
O W3C havia introduzido o CORS (Cross-Origin Resource Sharing) como uma solução padrão para fornecer uma maneira segura, flexível e recomendada de resolver esse problema.
O mecanismo
De alto nível, podemos simplesmente considerar que o CORS é um contrato entre a chamada AJAX do cliente do domínio A e uma página hospedada no domínio B, uma solicitação / resposta típica de origem cruzada seria:
DomainA cabeçalhos de solicitação 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
Cabeçalhos de resposta do domínio B
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
As partes azuis marcadas acima foram os fatos principais: "Cabeçalho de solicitação" Origem "indica de onde a solicitação de origem cruzada ou solicitação de comprovação se origina", o cabeçalho de resposta "Acesso-controle-Permitir-origem" indica que esta página permite solicitações remotas de DomínioA (se o valor for *, indica que permite solicitações remotas de qualquer domínio).
Como mencionei acima, o W3 recomendou que o navegador implementasse uma " solicitação de comprovação " antes de enviar a solicitação HTTP de origem cruzada, em poucas palavras, é uma OPTIONS
solicitação HTTP :
OPTIONS DomainB.com/foo.aspx HTTP/1.1
Se foo.aspx suportar o verbo HTTP OPTIONS, poderá retornar a resposta como abaixo:
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
Somente se a resposta contiver "Access-Control-Allow-Origin" E seu valor for "*" ou contiver o domínio que enviou a solicitação CORS, satisfazendo esta condição obrigatória, o navegador enviará a solicitação real entre domínios e armazenará em cache o resultado em " Cache de resultados de comprovação ".
Eu escrevi sobre o CORS há três anos: Solicitação HTTP de origem cruzada AJAX
http://siteA/MyCode.js
.