如何从Ajax调用修改Cookie

时间:2011-02-22 12:18:02

标签: 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);
    };

和/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。

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

2 个答案:

答案 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标题的内容 - 这只是一个概念验证:)