Как изменить Cookie из Ajax Call - PullRequest
       13

Как изменить Cookie из Ajax Call

14 голосов
/ 22 февраля 2011

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

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.

Ответы [ 2 ]

26 голосов
/ 26 февраля 2011

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

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

  • Accept-Charset
  • Accept-Encoding
  • Соединение
  • Content-Length
  • Cookie
  • Cookie2
  • Content-Transfer-Encoding
  • Дата
  • Ожидается
  • Хост
  • Keep-Alive
  • Referer
  • TE
  • Трейлер
  • Transfer-Encoding
  • Обновление
  • User-Agent
  • Через

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

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

0 голосов
/ 25 февраля 2011

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

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

Обходной путь - отправить пользовательский заголовок в скрипт php со строкой 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 - это только подтверждение концепции:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...