Кросс-доменный запрос POST не отправляет cookie Ajax JQuery

Кажется, что что-то подобное уже обсуждалось в stackoverflow, но я не мог найти точно то же самое.

Я пытаюсь отправить 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.

Ответ 1

Вы не можете устанавливать или читать файлы cookie в запросах CORS через JavaScript. Хотя CORS разрешает запросы с кросс-началом, куки файлы по-прежнему подчиняются политике браузера с одинаковым исходным кодом, а это означает, что только страницы из одного источника могут читать/записывать файл cookie. withCredentials означает, что любые файлы cookie, установленные удаленным хостом, отправляются на этот удаленный хост. Вам нужно будет установить cookie с удаленного сервера, используя заголовок Set-Cookie.

Ответ 2

Обратите внимание, что это не решает процесс обмена файлами 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);
      }
    }
);

Ответ 3

У меня была такая же проблема. Идентификатор сеанса отправляется в файл cookie, но поскольку запрос является междоменным, настройки безопасности браузера блокируют отправку файла cookie.

Решение.. Создайте идентификатор сеанса на клиенте (в браузере), используйте Javascript sessionStorage для хранения идентификатора сеанса, затем отправьте идентификатор сеанса с каждым запросом на сервер.

Я много боролся с этой проблемой, и не было много хороших ответов. Здесь подробно описывается решение: Запрос междоменного запроса Javascript с сеансом