Что может привести к тому, что файл 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 также показывает «Истекает» как «Недопустимая дата» на вкладке файлов cookie в ответе, но это также может быть Ошибка инструментов разработчика.

Любые идеи?


person AndiDog    schedule 10.02.2013    source источник
comment
Вы пытались запустить свой код на веб-сервере, например. не на локальном хосте?   -  person funerr    schedule 10.02.2013
comment
на каком языке ты это пишешь?   -  person TheZuck    schedule 10.02.2013
comment
Кроме того, если вы не находитесь в GMT, в каком часовом поясе вы находитесь?   -  person TheZuck    schedule 10.02.2013
comment
Я использую ServiceStack для веб-службы. Мой часовой пояс — Берлин (в настоящее время GMT+1), так что проблема не в этом, IMO.   -  person AndiDog    schedule 10.02.2013
comment
Я также сейчас попробовал с сервером на внешнем хосте, та же проблема. Даже изменил файл cookie на просто MyUserSession=TESTTEST, т. е. истечение срока действия сеанса и отсутствие ограничения пути URL-адреса — все равно не сохраняется!   -  person AndiDog    schedule 10.02.2013


Ответы (3)


Я думаю, что нашел решение. Поскольку во время разработки мой сервер находится на «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 сохраняется.

person AndiDog    schedule 10.02.2013
comment
Ты спас нас, мой герой! - person mVChr; 26.02.2014
comment
Это не ответ на вопрос или только его часть. - person Dimitri Kopriwa; 02.04.2018
comment
Можете ли вы дать конструктивный комментарий по поводу того, какой части не хватает, на которую вы хотели получить лучший ответ? - person AndiDog; 02.04.2018

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

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

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

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

person Manuel Pedrera    schedule 21.09.2015

откуда вы берете дату?

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

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());
person itsid    schedule 10.02.2013
comment
Отличная идея. Я ввел document.cookie = "MyUserSession=JxQoyzYm1VfESmuh-v22wyiyLREyOkuQWauziTrimjKo=;expires=Sun, 10 Feb 2013 22:08:47 GMT;path=/api/rest/" в консоли JS, и файл cookie действительно появился в моем расширении отладки файлов cookie. Очень странно. - person AndiDog; 10.02.2013
comment
возможно ли, что вы просто забыли прикрепить файл cookie к документу в своем предыдущем коде? IIRC его нельзя прикрепить, например, к window.cookie - person itsid; 11.02.2013
comment
кстати, это должно быть exdate.setDate(exdate.getTime() + (exhours *3600) ); //where exhours is 4 in your case, чтобы соответствовать желаемому сроку действия, конечно - person itsid; 11.02.2013