Подтвердить что ты не робот

Что может привести к тому, что cookie не будет установлен на клиенте?

У меня есть веб-приложение, которое использует jQuery.ajax для выполнения запроса другому хосту (прямо сейчас на самом деле то же самое, потому что я использую разные порты "localhost" ). Затем сервер возвращает файл cookie.

Значение cookie в ответе HTTP, как показано в Chrome Dev Tools,

Set-Cookie: MyUserSession=JxQoyzYm1VfESmuh-v22wyiyLREyOkuQWauziTrimjKo=;expires=Sun, 10 Feb 2013 22:08:47 GMT;path=/api/rest/

и, следовательно, истекает 4 часа в будущем.

Однако cookie не сохраняется и отправляется с последующими запросами (проверяется как в Chrome, так и в Firefox). Сначала я подумал, что это должно быть "10 февраля-2013" вместо "10 февраля 2013 года", но это не имеет значения. Chrome также показывает "Истекает" как "Недействительная дата" на вкладке "Куки" ответа, но это может быть ошибка Dev Tools.

Любые идеи?

4b9b3361

Ответ 1

Думаю, я нашел решение. Поскольку во время разработки мой сервер находится на "localhost: 30002" и моем веб-приложении на "localhost: 8003", они считаются разными хостами относительно CORS. Поэтому все мои запросы на сервер покрываются правилами безопасности CORS, особенно Запросы с учетными данными. "Учетные данные" включают файлы cookie, указанные в этой ссылке, поэтому возвращенный cookie не был принят, потому что я не прошел

xhrFields: {
  withCredentials: true
}

в функцию jQuery $.ajax. Я также должен передать этот вариант для последующих запросов CORS, чтобы отправить файл cookie.

Я добавил заголовок Access-Control-Allow-Credentials: true на стороне сервера и изменил заголовок Access-Control-Allow-Origin с шаблона на http://localhost:8003 (номер порта значителен!). Это решение теперь работает для меня, и файл cookie сохраняется.

Ответ 2

Откуда вы получаете дату?

если вы добавите его вручную, попробуйте сделать его отказоустойчивым

var exdays = 3; //3 days valid as an example
var exdate=new Date();
exdate.setDate(exdate.getDate() + exdays);
//Now set the cookie to said exdate
document.cookie = "MyUserSession =" + escape(JxQoyzYm1VfESmuh-v22wyiyLREyOkuQWauziTrimjKo=)+"; expires="+exdate.toUTCString());

Ответ 3

В течение нескольких часов после аналогичного сценария (без CORS) я обнаружил еще одну потенциальную причину: обязательно указать путь для файла cookie.

Мое внешнее приложение вызывало вызов HOST_URL/api/members/login, и это возвращало правильный заголовок Set-Cookie без пути.

Я видел cookie под Response Cookies в Chrome DevTools, но последующие запросы не включали его. Пошел на chrome://settings/cookies, и файл cookie был там, но путь был /api/members.

Указание корневого пути при настройке файла cookie на стороне сервера устраняет проблему.