Javascript 如何从Ajax调用修改Cookie

Javascript 如何从Ajax调用修改Cookie,javascript,cookies,xmlhttprequest,Javascript,Cookies,Xmlhttprequest,我有以下代码: 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",

我有以下代码:

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);

?>
我在Ubuntu上使用Firefox 3.6.13、Opera 11.00和Chromium 9.0

是否有人有同样的问题,或者可能无法修改Cookie头。

我认为这可能是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中,您可以获取自定义标头值并触发一个设置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头的内容-这只是概念证明:)

COOKIE头是不能在
XMLHttpRequest
中修改的几个COOKIE头之一。从:

如果标头是一个文件,则终止[执行
setRequestHeader
方法] 其中一个的匹配不区分大小写 以下标题:

  • 接受字符集
  • 接受编码
  • 联系
  • 内容长度
  • 饼干
  • 库克2
  • 内容传输编码
  • 日期
  • 期待
  • 主人
  • 活命
  • 推荐人
  • TE
  • 拖车
  • 传输编码
  • 升级
  • 用户代理
  • 通过
…或者如果标题的开头是 代理-或的不区分大小写匹配 秒-(包括页眉仅为 代理-或Sec-

上述标题由 用户代理让它控制这些 运输方面。这保证了 数据在某种程度上是完整的。标题 以Sec-开头的名称不可用 允许设置为允许新标题 被铸造而不保证 来自XMLHttpRequest


如果您没有使用1.5,我也不会感到惊讶,因为jqXHR文档特别指出
setRequestHeader(name,value),它通过用新值替换旧值而不是将新值连接到旧值,从而背离了标准,这意味着旧的方法是简单地连接值-但是在1.5中应该已经改变了。那么为什么不从头中删除cookie值呢?当我调用
xhr.setRequestHeader('Foo','Bar');setRequestHeader('Foo','Baz')
按预期发送
Foo:Baz
,但由于未知原因,它不会更改Cookie头。@jcubic-如果您使用的是jQuery 1.5之前的任何东西(可能检查以确保包含您认为是的jQuery版本),它会将“”与该调用连接到Cookie头值。对于1.5,它应该将Cookies头值替换为“”。我更改了这个问题,因为我在纯XMLHttpRequest中得到了相同的值。cookie是否仅在某个地方设置为http?我对此表示怀疑,但我只是想检查一下……如果我在查询字符串
showcookie.php?foo=qux
或使用
POST
中放入变量也是一样的,我不想在自定义头中获取new
foo
的值,但还是要更改real
Cookie
头,不过还是要谢谢你。是的,当然,没问题。您可以只更新document.cookie中设置的'foo'值,它将在xhr请求中发送。这正是我想知道的,谢谢。
$cookie = $_SERVER['HTTP_X_SET_COOKIE'];

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


print_r($_COOKIE);