Page 148 - 6108
P. 148
«Непростими» вважаються всі інші, наприклад, запит з методом PUT або з
заголовком Authorization не підходить під обмеження вище.
Принципова різниця між ними полягає в тому, що «простий» запит можна
сформувати і відправити на сервер і без XMLHttpRequest, наприклад за
допомогою HTML-форми.
CORS для простих запитів
У крос-доменний запит браузер автоматично додає заголовок Origin, що
містить домен, з якого здійснено запит.
У разі запиту на http://anywhere.com/request з http://somewhere.com/page
заголовки будуть приблизно такі:
GET / request
Host: anywhere.com
Origin: http: //somewhere.com
...
Сервер повинен, зі свого боку, відповісти спеціальними заголовками, чи
дозволяє він такий запит до себе.
Якщо сервер дозволяє крос-доменний запит з цього домену - він повинен
додати до відповіді заголовок Access-Control-Allow-Origin, що містить
домен запиту (в даному випадку «somewhere.com») або зірочку *.
Тільки при наявності такого заголовка у відповіді - браузер вважатиме
запит успішним, а інакше JavaScript отримає помилку.
Тобто, відповідь сервера може бути приблизно таким:
HTTP / 1.1 200 OK
Content-Type: text / html; charset = UTF-8
Access-Control-Allow-Origin: http://somewhere.com
Якщо Access-Control-Allow-Origin немає, то браузер вважає, що
дозвіл не отримано, і завершує запит з помилкою.
При таких запитах не передаються куки і заголовки HTTP-авторизації.
Параметри user і password в методі open ігноруються.
За замовчуванням браузер не передає з запитом куки і авторизаційні
заголовки. Щоб браузер передав разом із запитом куки і HTTP-авторизацію,
потрібно поставити запитом xhr.withCredentials = true:
var xhr = new XMLHttpRequest ();
xhr.withCredentials = true;
xhr.open ( 'POST', 'http://anywhere.com/request', true)
...
Далі – все як завжди, додаткових дій з боку клієнта не потрібно. Такий
XMLHttpRequest з куками, природно, вимагає від сервера більше дозволів, ніж
«анонімний». Тому для запитів з withCredentials передбачено додаткове
підтвердження з боку сервера.