Чи може відповідь AJAX встановити файл cookie?


266

Чи може відповідь AJAX встановити файл cookie? Якщо ні, то яке моє альтернативне рішення? Чи слід його встановлювати за допомогою Javascript або щось подібне?


Я використовую node.js Express. Я помітив, що якщо ви це зробите, вам доведеться занадто очевидно встановити поле httpOnly на false на стороні сервера.
Chong Lip Phang

Відповіді:


247

Так , ви можете встановити файли cookie у запиті AJAX у коді на стороні сервера так само, як і для звичайного запиту, оскільки сервер не може диференціювати звичайний запит або запит AJAX.

Запити AJAX - це лише особливий спосіб запиту на сервер, сервер повинен відповісти назад, як і в будь-якому HTTP-запиті. У відповідь на запит ви можете додати файли cookie.


39
Майте на увазі, що про те, чи буде cookie шановане HTTP-агентом, це вже інша історія.
Франці Пенов

6
@Franci: погодився. Але я думаю, що питання має сенс лише для клієнтів http, які підтримують файли cookie. Тому все питання-Аскер тільки хоче знати , якщо куки можуть бути записані в запиті AJAX , що означає , що його UA підтримує печиво :)
це. __curious_geek

10
If the user agent supports HTTP State Management it should persist, discard and send cookies (as received in the Set-Cookie response header, and sent in the Cookie header) as applicable.- від w3.org/TR/XMLHttpRequest
smwikipedia

12
Це відповідає, якщо сервер може відповісти на запит ajax із заголовком Set-Cookie. Звичайно, це може, але питання полягає в тому, чи справді ця відповідь призведе до того, що клієнт читає та встановлює файли cookie, отримані у відповіді на ajax, чи це потрібно зробити вручну. Це не відповідь на це.
Алекс

2
@Legends У запитах Ajax зазвичай заголовок X-Requested-With встановлено на XMLHttpRequest, саме так їх можна ідентифікувати, але запит можна зробити без цього заголовка, якщо це станеться, його неможливо відрізнити від нормального завантаження сторінки
T0m

292

Згідно з розділом 4.6.3 специфікації w3 для XMLHttpRequest, агент користувача повинен шанувати заголовок Set-Cookie. Отже, відповідь - так, ви повинні вміти.

Цитата:

Якщо користувальницький агент підтримує управління HTTP State, він повинен зберігатись, відкидати та надсилати файли cookie (як отримано у заголовку відповіді Set-Cookie та надісланому у заголовку Cookie) у відповідних випадках.


1
Чи підтримує IE заголовок Set-Cookie у відповідях у випадку відповідей XHR?
detj

Як слід на переспрямуванні, і це не шанує в деяких браузерах.
Вальтер Макамбіра

1
Для мене, що користується Chrome, заголовки, отримані в запитах ajax, автоматично будуть застосовані до клієнта.
Алекс

Я виявив, що якщо сервер повертає відповідь як gzip, файл cookie не встановлюється. Це повинно бути частиною специфікації або це лише питання впровадження?
juminoz

89

Для запису слід пам’ятати, що все вищезазначене (все-таки) відповідає дійсності лише в тому випадку, якщо дзвінок AJAX здійснювався в одному домені. Якщо ви шукаєте налаштування файлів cookie на іншому домені за допомогою AJAX, ви відкриваєте зовсім іншу банку глистів . Читання файлів cookie між доменами працює, але (або принаймні сервер їх обслуговує; чи дозволить UA вашого клієнта отримати доступ до коду, знову ж таки, це інша тема; станом на 2014 рік вони).


26
Для того, щоб відправити печиво міждоменні, вам необхідно встановити withCredentials прапор
aeosynth

5
Для сценарію междоменной, 3 речей повинні відбутися: - (1) потреба клієнта в набір withCredentials=trueдля xhrоб'єкта (2) Встановити Access-Control-Allow-Credentialsяк в OPTIONS передпольотного запиті, а також фактичне запиті (3) Набір печиво по мірі необхідності
Кунал

6

Також переконайтеся, що ваш сервер не встановлює захищені файли cookie на запит, який не є http. Щойно з'ясував, що мій запит на ajax отримує сеанс php із "безпечним" набором. Оскільки я не був на https, він не відсилав файли cookie сеансу, і мій сеанс перезавантажувався під час кожного запиту ajax.


Ви можете мені сказати, де я можу перевірити, чи встановлено безпеку Ajax?
Ziumper

1
Це насправді не конкретний ajax. Перевірте "Захищений" у відповіді заголовка Set-Cookie від сервера, якщо ви використовуєте небезпечну http: //
Phil
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.