Может ли ответ AJAX установить cookie?

266

Может ли ответ AJAX установить cookie? Если нет, каково мое альтернативное решение? Должен ли я установить его с помощью Javascript или чего-то подобного?

Биллворт Вандори
источник
Я использую node.js Express. Я заметил, что если вы сделаете это, вы должны установить для поля httpOnly значение false на стороне сервера, очевидно.
Чонг Лип Панг

Ответы:

248

Да , вы можете установить cookie в запросе AJAX в коде на стороне сервера так же, как и в случае обычного запроса, поскольку сервер не может различить обычный запрос или запрос AJAX.

AJAX-запросы - это просто особый способ запроса к серверу, сервер должен отвечать обратно, как и в любом HTTP-запросе. В ответ на запрос вы можете добавить куки.

этот. __curious_geek
источник
40
Имейте в виду, что соблюдение cookie-файла агентом HTTP - это отдельная история.
Франси Пенов
6
@Franci: согласился. Но я думаю, что вопрос имеет смысл только для клиентов http, которые поддерживают cookie. Поэтому все, кто задает вопрос, хотят знать, можно ли записать файлы cookie в запросе AJAX, что означает, что его UA поддерживает файлы cookie :)
вот. __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
293

В соответствии с разделом 4.6.3 спецификации w3 для XMLHttpRequest пользовательский агент должен соблюдать заголовок Set-Cookie. Так что ответ - да, ты должен быть в состоянии.

Цитата:

Если пользовательский агент поддерживает HTTP State Management, он должен сохранять, отбрасывать и отправлять куки-файлы (как получено в заголовке ответа Set-Cookie и отправлено в заголовке Cookie), в зависимости от обстоятельств.

Strelok
источник
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) Установить cookie по мере необходимости
Кунал
6

Также убедитесь, что ваш сервер не устанавливает безопасные файлы cookie по запросу, отличному от http. Просто узнал, что мой ajax-запрос получал php-сессию с установленным «secure». Поскольку я не был на https, он не отправлял cookie-файл сеанса, и мой сеанс сбрасывался при каждом ajax-запросе.

Фил
источник
Можете ли вы сказать мне, где я могу проверить, установлен ли ajax secure?
Ziumper
1
Это не совсем AJAX. Проверьте «Безопасный» в ответе заголовка Set-Cookie от сервера, если вы используете небезопасный http: //
Фил