Может ли ответ AJAX установить cookie? Если нет, каково мое альтернативное решение? Должен ли я установить его с помощью Javascript или чего-то подобного?
Может ли ответ AJAX установить cookie? Если нет, каково мое альтернативное решение? Должен ли я установить его с помощью Javascript или чего-то подобного?
Ответы:
Да , вы можете установить 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. Так что ответ - да, ты должен быть в состоянии.
Цитата:
Если пользовательский агент поддерживает HTTP State Management, он должен сохранять, отбрасывать и отправлять куки-файлы (как получено в заголовке ответа Set-Cookie и отправлено в заголовке 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-запросе.