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
- 拖车
- 传输编码
- 升级
- 用户代理
- 通过
如果您没有使用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
中放入变量也是一样的,我不想在自定义头中获取newfoo
的值,但还是要更改realCookie
头,不过还是要谢谢你。是的,当然,没问题。您可以只更新document.cookie中设置的'foo'值,它将在xhr请求中发送。这正是我想知道的,谢谢。
$cookie = $_SERVER['HTTP_X_SET_COOKIE'];
// NOTE: really should sanitise the cookie input.
header('Set-Cookie: ' . $cookie);
print_r($_COOKIE);