Как изменить Cookie из вызова Ajax

У меня есть этот код:

window.onload = function() {
        document.cookie = 'foo=bar; expires=Sun, 01 Jan 2012 00:00:00 +0100; path=/';
        var xhr = new XMLHttpRequest();
        xhr.open("GET", "/showcookie.php",true);
        xhr.setRequestHeader("Cookie", "foo=quux");

        xhr.setRequestHeader("Foo", "Bar");
        xhr.setRequestHeader("Foo", "Baz");

        xhr.withCredentials = true;
        var pre = document.getElementById('output');
        xhr.onreadystatechange = function() {
            if (4 == xhr.readyState) {
                pre.innerHTML += xhr.responseText + "\n";
            }
        };
        xhr.send(null);
    };

и этот /showcookie.php

<?php

print_r($_COOKIE);

?>

и всегда показывает

Array
(
    [Host] => localhost
    [User-Agent] => 
    [Accept] => 
    [Accept-Language] => pl,en-us;q=0.7,en;q=0.3
    [Accept-Encoding] => gzip,deflate
    [Accept-Charset] => ISO-8859-2,utf-8;q=0.7,*;q=0.7
    [Keep-Alive] => 115
    [Connection] => keep-alive
    [foo] => Baz
    [Referer] =>
    [Cookie] => foo=bar
)

Array
(
    [foo] => bar
)

Я использую Firefox 3.6.13, Opera 11.00 и Chromium 9.0 на Ubuntu.

У кого-то есть такая же проблема или, возможно, невозможно изменить заголовок Cookie.

Ответы

Ответ 1

Заголовок Cookie является одним из нескольких, которые нельзя изменить в XMLHttpRequest. Из спецификация:

Завершить [выполнение метода setRequestHeader], если заголовок является нечувствительность к регистру для одного из следующие заголовки:

  • Accept-Charset
  • Accept-Encoding
  • Подключение
  • Content-Length
  • Cookie
  • Cookie2
  • Content-Transfer-Encoding
  • Дата
  • Ожидать
  • Хост
  • Keep-Alive
  • Referer
  • TE
  • Прицеп
  • Transfer-Encoding
  • Обновление
  • User-Agent
  • С помощью

... или если начало заголовка является нечувствительность к регистру для прокси- или Sec- (в том числе, когда заголовок просто Proxy- или Sec -).

Вышеуказанные заголовки контролируются пользовательский агент позволяет ему управлять этими аспекты транспорта. Это гарантирует целостность данных в некоторой степени. заголовок имена, начинающиеся с Sec, не разрешено устанавливать новые заголовки быть отчеканенными, которые гарантированы не из XMLHttpRequest.

Ответ 2

Я думаю, что это может быть жестким ограничением функциональности XHR.

Настройка clientide document.cookie вызвало отправку заголовка Cookie в запросах, как ожидалось. Если вы хотите передать значение cookie в запросе ajax, это может быть путь.

Обходной путь заключается в отправке настраиваемого заголовка в php script с помощью строки cookie, которую вы хотите установить:

// in the js...
xhr.open("GET", "showcookie.php",true);
//xhr.setRequestHeader("Cookie", "foo=quux");
xhr.setRequestHeader("X-Set-Cookie", "foo2=quux");

xhr.withCredentials = true;

Затем в вашем showcookie.php вы можете получить собственное значение заголовка и запустить заголовок ответа set-cookie:

$cookie = $_SERVER['HTTP_X_SET_COOKIE'];

// NOTE: really should sanitise the cookie input.
header('Set-Cookie: ' . $cookie);


print_r($_COOKIE);

Обратите внимание, что вы не увидите заголовок файла cookie, пока анализатор не будет проанализирован браузером. Также убедитесь, что вы дезинфицируете содержимое заголовка X_SET_COOKIE - это только доказательство концепции:)