如何从Ajax调用修改Cookie

jcu*_*bic 14 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", "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);
    };
Run Code Online (Sandbox Code Playgroud)

这个/showcookie.php

<?php

print_r($_COOKIE);

?>
Run Code Online (Sandbox Code Playgroud)

它总是显示出来

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
)
Run Code Online (Sandbox Code Playgroud)

我在Ubuntu上使用Firefox 3.6.13,Opera 11.00和Chromium 9.0.

是否有人有同样的问题或者修改Co​​okie标头是不可能的.

Tgr*_*Tgr 26

Cookie标头是几个中无法修改的标头之一XMLHttpRequest.从规格:

如果header是以下标头之一的不区分大小写的匹配,则终止[执行setRequestHeader方法]:

  • 接收字符
  • 接受编码
  • 连接
  • 内容长度
  • 曲奇饼
  • COOKIE2
  • 内容传输编码
  • 日期
  • 期望
  • 主办
  • 活着
  • 引荐
  • TE
  • 预告片
  • 传输编码
  • 升级
  • 用户代理
  • 通过

...或者如果标头的开头是Proxy-或Sec-的不区分大小写匹配(包括标头只是代理或秒).

上述标题由用户代理控制,以便控制传输的这些方面.这在一定程度上保证了数据完整性.不允许将以Sec-开头的头名称设置为允许新的头文件被保证不会来自XMLHttpRequest.