我有这段代码:
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
)
我在Ubuntu上使用Firefox 3.6.13,Opera 11.00和Chromium 9.0。
是否有人遇到同样的问题,或者修改Cookie标头是不可能的。
答案 0 :(得分:26)
Cookie标头是无法在XMLHttpRequest
中修改的几个标头之一。来自specification:
如果标题是a,则终止 [执行
setRequestHeader
方法] 其中一个的不区分大小写的匹配 以下标题:
- 接收字符集
- 接受编码
- 连接
- 的Content-Length
- 曲奇
- COOKIE2
- 内容传输编码
- 日期
- 期望
- 主机
- 保持活动
- Referer的
- TE
- 拖车
- 传送编码
- 升级
- 的User-Agent
- 经
...或者如果标题的开头是a Proxy-或。的大小写不敏感匹配 Sec-(包括标题时的情况 代理或秒 - )。
以上标题由 用户代理让它控制那些 运输方面。这保证了 数据完整性在一定程度上。头 以Sec-开头的名称不是 允许设置为允许新标头 被铸造但不保证 来自XMLHttpRequest。
答案 1 :(得分:0)
我认为这可能是对XHR功能的严格限制。
设置clientside document.cookie导致Cookie标头按预期在请求中发送。如果你想在一个ajax请求中传递一个cookie值,这可能就是你想要的。
解决方法是使用您要设置的cookie字符串将自定义标头发送到php脚本:
// 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标题的内容 - 这只是一个概念验证:)