Почему jquery.метод ajax () не отправляет cookie сеанса?

после входа в систему через $.ajax() на сайт, я пытаюсь отправить второй $.ajax() запрос на этот сайт-но когда я проверяю заголовки, отправленные с помощью FireBug, в запрос не включается файл cookie сеанса.

что я делаю не так?

10 ответов


вызовы AJAX отправляют куки только в том случае, если url-адрес, который вы вызываете, находится в том же домене, что и ваш вызывающий скрипт.

Это может быть Междоменной проблемой.

возможно, вы пытались вызвать url из www.domain-a.com пока ваш вызывающий скрипт был включен www.domain-b.com (другими словами: вы сделали Междоменный вызов, и в этом случае браузер не будет отправлять куки-файлы для защиты вашей конфиденциальности).

в этом случае ваши варианты:

  • напишите небольшой прокси, который находится на домен-b и пересылает ваши запросы на домен-a. Ваш браузер позволит вам вызвать прокси-сервер, потому что он находится на том же сервере, что и вызывающий скрипт.
    этот прокси-сервер затем может быть настроен вами, чтобы принять имя cookie и параметр значения, который он может отправить в домен-A. Но для этого вам нужно знать имя файла cookie и значение вашего сервера в домене-a для аутентификации.
  • если вы получаете объекты JSON, попробуйте использовать JSONP запрос вместо этого. jQuery поддерживает их. Но вам нужно изменить свой сервис на домене-a, чтобы он возвращал действительный JSONP.

рад, если это помогло хотя бы немного.


Я работаю в междоменном сценарии. Во время входа удаленный сервер возвращает Set-Cookie заголовок вместе с Access-Control-Allow-Credentials значение true.

следующий вызов ajax на удаленный сервер должен использовать этот файл cookie.

ПДБС это!--3--> можно ли разрешить междоменное ведение журнала. Проверить https://developer.mozilla.org/En/HTTP_access_control для примеров.

для меня это похоже на ошибку в JQuery (или, по крайней мере, feature-to-be в следующем версия.)

обновление:

  1. Cookies не устанавливаются автоматически из ответа AJAX (ссылка: http://aleembawany.com/2006/11/14/anatomy-of-a-well-designed-ajax-login-experience/)

    почему?

  2. вы не можете получить значение cookie из ответа, чтобы установить его вручную (http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-getresponseheader)

    Я смущенный..

    должен существовать способ спросить jquery.ajax() установить


используя

xhrFields: { withCredentials:true }

как часть моего вызова jQuery ajax был только частью решения. Мне также нужно было, чтобы заголовки возвращались в ответе OPTIONS от моего ресурса:

Access-Control-Allow-Origin : http://www.wombling.com
Access-Control-Allow-Credentials : true

важно, что только один разрешенный "origin" был в заголовке ответа вызова опций и не"*". Я достиг этого, прочитав происхождение запроса и заполнив его обратно в ответ-вероятно, обойдя первоначальную причину для ограничения, но в моем случае использования безопасность не имеет первостепенного значения.

Я подумал, что стоит явно упомянуть требование только для одного источника, поскольку стандарт W3C допускает список, разделенный пробелом ,но Chrome этого не делает! http://www.w3.org/TR/cors/#access-control-allow-origin-response-header NB бит" на практике".


поместите это в свою функцию init:

$.ajaxSetup({
  xhrFields: {
    withCredentials: true
  }
});

Он будет работать.


на этот вопрос уже есть много хороших ответов, но я подумал, что может быть полезно уточнить случай, когда вы ожидаете, что файл cookie сеанса будет отправлен, потому что домен cookie соответствует, но он не отправляется, потому что запрос AJAX делается в другой поддомен. В этом случае у меня есть cookie, который назначен*.mydomain.com домен, и я хочу, чтобы он был включен в запрос AJAX на different.mydomain.com". По по умолчанию файл cookie не отправляется. Для решения этой проблемы не нужно отключать HTTPONLY в файле cookie сеанса. Вам нужно только сделать то, что предложил уомблинг (https://stackoverflow.com/a/23660618/545223) и сделайте следующее.

1) добавьте следующее к вашему запросу ajax.

xhrFields: { withCredentials:true }

2) добавьте следующее в заголовки ответов для ресурсов в другом поддомене.

Access-Control-Allow-Origin : http://original.mydomain.com
Access-Control-Allow-Credentials : true

попробовав другие решения и все еще не получив его, я узнал, в чем проблема в моем случае. Я изменил contentType с "application/json" на "text / plain".

$.ajax(fullUrl, {
    type: "GET",
    contentType: "text/plain",
    xhrFields: {
         withCredentials: true
    },
    crossDomain: true
});

У меня была такая же проблема, и я делал некоторые проверки, мой скрипт просто не получал cookie sessionid.

Я понял, посмотрев на значение cookie sessionid в браузере, что моя платформа (Django) передавала cookie sessionid с HttpOnly по умолчанию. Это означало, что скрипты не имели доступа к значению sessionid и поэтому не передавали его вместе с запросами. Смешно, что HttpOnly будет значением по умолчанию, когда так много вещи используют Ajax, который потребует ограничения доступа.

чтобы исправить это, я изменил настройку (SESSION_COOKIE_HTTPONLY=False), но в других случаях это может быть флаг "HttpOnly" на пути к cookie


Если вы разрабатываете на localhost или порт на localhost, такие как localhost:8080, в дополнение к шагам, описанным в ответах выше, вам также необходимо убедиться, что вы не передаете значение домена в заголовке Set-Cookie.
Вы не можете установить домен в localhost в заголовке Set-Cookie-это неверно-просто опустите домен.

посмотреть Cookies на localhost с явным доменом и почему не будет asp.net создание cookies в имя localhost?


вы должны инициализировать сеанс, прежде чем пытаться войти в систему.

для php, вы должны сделать

session_start();

на странице, с которой вы начинаете вход ajax вызова.

Так что SESSIONID будет создан и сохранен файл cookie браузера. И отправляется вместе с заголовком запроса во время вызова ajax, если вы выполняете запрос ajax на тот же домен

для последовательных вызовов ajax браузер будет использовать SESSIONID что создал и изначально сохраняются в cookie браузера, если мы не очистить куки браузера или сделайте logout (или другое печенье)


возможно, не 100% ответ на вопрос, но я наткнулся на этот поток в надежде решить проблему сеанса, когда ajax-публикация fileupload из assetmanager редактора innovastudio. В конце концов решение было простым: у них есть flash-загрузчик. Отключение этого (настройка

var flashUpload = false;   

в актив.php), и огни снова начали мигать.

поскольку эти проблемы могут быть очень трудно отладить, я обнаружил, что положить что-то вроде следующего обработчик загрузки установит вас (ну, меня в этом случае) на правильный путь:

$sn=session_name();
error_log("session_name: $sn ");

if(isset($_GET[$sn])) error_log("session as GET param");
if(isset($_POST[$sn])) error_log("session as POST param");
if(isset($_COOKIE[$sn])) error_log("session as Cookie");
if(isset($PHPSESSID)) error_log("session as Global");

погружение в журнал, и я быстро заметил отсутствующий сеанс, где не было отправлено cookie.