Cross-Origin Resource Sharing - CORS
(запит AKA Cross-Domain AJAX) - це проблема, з якою можуть зіткнутися більшість веб-розробників. Відповідно до політики Same-Origin-поля, браузери обмежують JavaScript клієнта в пісочниці безпеки, зазвичай JS не може безпосередньо спілкуватися з віддаленим сервером з іншого домену. У минулому розробники створювали багато складних способів досягнення запиту на ресурси між доменними, найчастіше використовуючи такі способи:
- Використовуйте Flash / Silverlight або сторону сервера як "проксі" для спілкування з дистанційним.
- JSON З накладкою ( JSONP ).
- Вставляє віддалений сервер у iframe та спілкується через фрагмент або window.name, зверніться сюди .
У цих хитрих способів виникають більш-менш деякі проблеми, наприклад, JSONP може спричинити загрозу в безпеці, якщо розробники просто "зрівняють" це, і №3 вище, хоча це працює, обидва домени повинні будувати між собою суворий контракт, він не є гнучким і не елегантним ІМХО :)
Компанія W3C представила перехресне походження ресурсів (CORS) як стандартне рішення, щоб забезпечити безпечний, гнучкий та рекомендований стандартний спосіб вирішення цієї проблеми.
Механізм
З високого рівня ми можемо просто вважати, що CORS - це договір між клієнтським дзвінком AJAX з домену A та сторінкою, розміщеною на домені B, типовим запитом / відповіддю Cross-Origin буде:
Заголовки запитів DomainA 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
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
Сині частини, які я зазначив вище, були фактами ядра, "Заголовок запиту" Походження "вказує, звідки походить запит перехресного походження або запит перед польотом", заголовок відповіді "Доступ-контроль-дозволити-походження" вказує, що ця сторінка дозволяє віддалений запит від DomainA (якщо значення * вказати, дозволяє віддалені запити з будь-якого домену).
Як я вже згадував вище, W3 рекомендував браузеру реалізувати " запит перед польотом" перед тим, як подати насправді крос-похідний HTTP-запит, у двох словах це OPTIONS
запит HTTP :
OPTIONS DomainB.com/foo.aspx HTTP/1.1
Якщо foo.aspx підтримує дієслово OPTIONS HTTP, воно може повернути відповідь, як показано нижче:
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, виконавши цей обов'язковий стан, браузер надішле фактичний крос-доменний запит і кешуватиме результат у " Кеш-попередній політ-результат ".
Три роки тому я блогував про CORS: HTTP-запит AJAX Cross-Origin
http://siteA/MyCode.js
.