Междоменный POST-запрос не отправляет cookie Ajax Jquery
Кажется, что-то подобное уже обсуждалось на stackru, но я не смог найти точно то же самое.
Я пытаюсь отправить Cookie с помощью CORS(общий доступ к ресурсам разных источников), но он не работает.
Это мой код
$.ajax(
{
type: "POST",
url: "http://example.com/api/getlist.json",
dataType: 'json',
xhrFields: {
withCredentials: true
},
crossDomain: true,
beforeSend: function(xhr) {
xhr.setRequestHeader("Cookie", "session=xxxyyyzzz");
},
success: function(){
alert('success');
},
error: function (xhr) {
alert(xhr.responseText);
}
}
);
Я не вижу этот файл cookie в запросе HEADER.
3 ответа
Вы не можете устанавливать или читать файлы cookie для запросов CORS через JavaScript. Несмотря на то, что CORS допускает запросы с разными источниками, файлы cookie все еще подчиняются политике браузера того же источника, что означает, что только страницы одного и того же происхождения могут читать / записывать файлы cookie. withCredentials
означает только то, что файлы cookie, установленные удаленным хостом, отправляются этому удаленному хосту. Вам нужно будет установить cookie с удаленного сервера, используя Set-Cookie
заголовок.
В последнее время на этой арене произошло множество изменений, поэтому я подумал, что свежий ответ будет полезным.
Чтобы файл cookie отправлялся браузером на другой сайт во время запроса, должны быть соблюдены следующие критерии:
- В
Set-Cookie
заголовок с целевого сайта должен содержатьSameSite=None
а такжеSecure
этикетки. ЕслиSecure
не используетсяSameSite
заголовок будет проигнорирован. - Запрос должен быть направлен в
https
конечная точка, требованиеSecure
флаг. - В
XHRRequest
должно быть сделано сwithCredentials=true
. При использовании$.ajax()
это достигается с помощьюxhrFields
параметр (требующийjQuery=1.5.1+
) - Сервер должен ответить
Access-Control-Allow-Origin
заголовок, соответствующий запросуOrigin
заголовок. (*
не будет уважаться в этом случае)
Многие люди попадают в этот пост, пытаясь выполнить локальную разработку для удаленной конечной точки, что возможно при соблюдении вышеуказанных критериев.
Обратите внимание, что это не решает процесс обмена файлами cookie, так как в целом это плохая практика.
Вы должны использовать JSONP в качестве типа:
Из документации $.ajax: междоменные запросы и dataType: запросы "jsonp" не поддерживают синхронную работу.
$.ajax(
{
type: "POST",
url: "http://example.com/api/getlist.json",
dataType: 'jsonp',
xhrFields: {
withCredentials: true
},
crossDomain: true,
beforeSend: function(xhr) {
xhr.setRequestHeader("Cookie", "session=xxxyyyzzz");
},
success: function(){
alert('success');
},
error: function (xhr) {
alert(xhr.responseText);
}
}
);
У меня была такая же проблема. Идентификатор сеанса отправляется в cookie-файле, но поскольку запрос является междоменным, настройки безопасности браузера блокируют отправку cookie-файла.
Решение. Сгенерируйте идентификатор сеанса на клиенте (в браузере), используйте Javascript sessionStorage, чтобы сохранить идентификатор сеанса, а затем отправьте идентификатор сеанса с каждым запросом на сервер.
Я много боролся с этой проблемой, и не было много хороших ответов. Вот статья, подробно описывающая решение: междоменный запрос Javascript с сеансом