Может ли ответ AJAX установить cookie? Если нет, каково мое альтернативное решение? Должен ли я установить его с помощью Javascript или чего-то подобного?
Я использую node.js Express. Я заметил, что если вы сделаете это, вы должны установить для поля httpOnly значение false на стороне сервера, очевидно.
Чонг Лип Панг
Ответы:
248
Да , вы можете установить cookie в запросе AJAX в коде на стороне сервера так же, как и в случае обычного запроса, поскольку сервер не может различить обычный запрос или запрос AJAX.
AJAX-запросы - это просто особый способ запроса к серверу, сервер должен отвечать обратно, как и в любом HTTP-запросе. В ответ на запрос вы можете добавить куки.
Имейте в виду, что соблюдение 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, так они могут быть идентифицированы, но запрос может быть выполнен без этого заголовка, если это происходит, его нельзя отличить от обычной загрузки страницы
Если пользовательский агент поддерживает HTTP State Management, он должен сохранять, отбрасывать и отправлять куки-файлы (как получено в заголовке ответа Set-Cookie и отправлено в заголовке Cookie), в зависимости от обстоятельств.
Поддерживает ли IE заголовок Set-Cookie в ответах, в случае ответов XHR?
detj
Как следует на редиректе, и это не соблюдается в некоторых браузерах.
Вальтер Макамбира
1
Для меня, использующего Chrome, заголовки, полученные в запросах ajax, автоматически применяются к клиенту.
Алекс
Я обнаружил, что если серверная сторона возвращает ответ в виде gzip, cookie не устанавливается. Это должно быть частью спецификации или это просто проблема реализации?
juminoz
89
Для справки, имейте в виду, что все вышеперечисленное (все еще) верно только в том случае, если вызов AJAX выполняется в том же домене. Если вы хотите установить файлы cookie в другом домене с помощью AJAX, вы открываете совершенно другую банку с червями . Однако чтение междоменных файлов cookie работает (или, по крайней мере, сервер обслуживает их; разрешает ли UA вашего клиента доступ к ним для вашего кода, опять же, другая тема; по состоянию на 2014 год это происходит).
Для того, чтобы отправить печенье междоменные, вам необходимо установить 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-запросе.
Ответы:
Да , вы можете установить cookie в запросе AJAX в коде на стороне сервера так же, как и в случае обычного запроса, поскольку сервер не может различить обычный запрос или запрос AJAX.
AJAX-запросы - это просто особый способ запроса к серверу, сервер должен отвечать обратно, как и в любом HTTP-запросе. В ответ на запрос вы можете добавить куки.
источник
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В соответствии с разделом 4.6.3 спецификации w3 для XMLHttpRequest пользовательский агент должен соблюдать заголовок Set-Cookie. Так что ответ - да, ты должен быть в состоянии.
Цитата:
источник
Для справки, имейте в виду, что все вышеперечисленное (все еще) верно только в том случае, если вызов AJAX выполняется в том же домене. Если вы хотите установить файлы cookie в другом домене с помощью AJAX, вы открываете совершенно другую банку с червями . Однако чтение междоменных файлов cookie работает (или, по крайней мере, сервер обслуживает их; разрешает ли UA вашего клиента доступ к ним для вашего кода, опять же, другая тема; по состоянию на 2014 год это происходит).
источник
withCredentials=true
дляxhr
объекта (2) УстановитьAccess-Control-Allow-Credentials
как в предварительном запросе OPTIONS, так и фактическом запросе (3) Установить cookie по мере необходимостиТакже убедитесь, что ваш сервер не устанавливает безопасные файлы cookie по запросу, отличному от http. Просто узнал, что мой ajax-запрос получал php-сессию с установленным «secure». Поскольку я не был на https, он не отправлял cookie-файл сеанса, и мой сеанс сбрасывался при каждом ajax-запросе.
источник