Как изменить 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 - это только доказательство концепции:)