Междоменный 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 отправлялся браузером на другой сайт во время запроса, должны быть соблюдены следующие критерии:

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

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

Другие вопросы по тегам