Page 149 - 6108
P. 149
При запиті з withCredentials сервер повинен повернути вже не один, а
два заголовка:
Access-Control-Allow-Origin: домен
Access-Control-Allow-Credentials: true
Приклад заголовків:
HTTP / 1.1 200 OK
Content-Type: text / html; charset = UTF-8
Access-Control-Allow-Origin: http://javascript.ru
Access-Control-Allow-Credentials: true
Використання зірочки * в Access-Control-Allow-Origin при цьому
заборонено.
Якщо цих заголовків не буде, то браузер не дасть JavaScript'у доступ до
відповіді сервера.
«Непрості» запити
У крос-доменному XMLHttpRequest можна вказати не тільки GET / POST,
але і будь-який інший метод, наприклад PUT, DELETE.
Колись ніхто і не думав, що сторінка зможе зробити такі запити. Тому ряд
веб-сервісів написані в припущенні, що «якщо метод - нестандартний, то це не
браузер». Деякі веб-сервіси навіть враховують це при перевірці прав доступу.
Щоб припинити будь-які непорозуміння, браузер використовує додатковий
запит у випадках, коли:
1) Якщо метод - не GET / POST / HEAD.
2) Якщо заголовок Content-Type має значення відмінне від application
/ x-www-form-urlencoded, multipart / form-data або text / plain,
наприклад application / xml.
3) Якщо встановлюються інші HTTP-заголовки, крім Accept, Accept-
Language, Content-Language.
Будь-яка з умов вище веде до того, що браузер зробить два HTTP-запити.
Перший запит називається «предзапит» (англійський термін «preflight»).
Браузер робить його цілком за власною ініціативою, з JavaScript ми про нього
нічого не знаємо, хоча можемо побачити в інструментах розробника.
Цей запит використовує метод OPTIONS. Він не містить тіла і містить
назву бажаного методу в заголовку Access-Control-Request-Method, а
якщо додані особливі заголовки, то і їх теж - в Access-Control-Request-
Headers.
Його завдання - запитати сервер, чи дозволяє він використовувати
вибраний метод і заголовки.
На цей запит сервер повинен відповісти статусом 200, без тіла відповіді,
вказавши заголовки
Access-Control-Allow-Method: метод
і, при необхідності,
Access-Control-Allow-Headers: дозволені заголовки.