Распределение ресурсов между источниками - CORS
(кросс-доменный запрос AJAX AKA) - это проблема, с которой может столкнуться большинство веб-разработчиков. Согласно Same-Origin-Policy, браузеры ограничивают клиентский JavaScript в изолированной программной среде безопасности, обычно JS не может напрямую взаимодействовать с удаленным сервером. из другого домена. В прошлом разработчики создавали множество хитрых способов достижения запроса к междоменным ресурсам, чаще всего с использованием следующих способов:
- Используйте Flash / Silverlight или серверную часть в качестве «прокси» для связи с удаленным.
- JSON With Padding ( JSONP ).
- Встраивает удаленный сервер в iframe и связывается через фрагмент или имя window.name, см. Здесь .
У этих хитрых способов есть более или менее некоторые проблемы, например, JSONP может привести к дыре в безопасности, если разработчики просто «оценят» ее, и № 3 выше, хотя это работает, оба домена должны заключать строгие контракты друг с другом, это ни гибко, ни элегантно ИМХО:)
W3C представила Cross-Origin Resource Sharing (CORS) в качестве стандартного решения, чтобы обеспечить безопасный, гибкий и рекомендуемый стандартный способ решения этой проблемы.
Механизм
На высоком уровне мы можем просто считать, что CORS - это контракт между клиентским вызовом AJAX из домена A и страницей, размещенной в домене B, типичный запрос / ответ Cross-Origin будет выглядеть так:
Заголовки AJAX-запроса DomainA
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
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
Синие части, которые я отмечал выше, были основными фактами, заголовок запроса «Происхождение» указывает, откуда исходит перекрестный запрос или запрос предварительной проверки », заголовок ответа« Access-Control-Allow-Origin »указывает, что эта страница допускает удаленный запрос от DomainA (если значение * указывает, разрешает удаленные запросы из любого домена).
Как я упоминал выше, W3 рекомендовал браузеру реализовать «предварительный запрос » перед отправкой фактически HTTP-запроса Cross-Origin, в двух словах это HTTP- OPTIONS
запрос:
OPTIONS DomainB.com/foo.aspx HTTP/1.1
Если foo.aspx поддерживает HTTP-глагол OPTIONS, он может вернуть ответ, как показано ниже:
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
Только если ответ содержит «Access-Control-Allow-Origin» И его значение равно «*» или содержит домен, который отправил запрос CORS, при выполнении этого обязательного условия браузер отправит фактический междоменный запрос и кеширует результат в " Preflight-Result-Cache ".
Я писал о CORS три года назад: HTTP-запрос AJAX Cross-Origin
http://siteA/MyCode.js
.