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: дозволені заголовки.
   144   145   146   147   148   149   150   151   152   153   154