为什么设置document.cookie在Chrome中不起作用

Why would setting document.cookie not work in Chrome?

本文关键字:Chrome 不起作用 cookie 设置 document 为什么      更新时间:2023-09-26

我的同事遇到了一个问题,无法通过以下代码在Chrome上设置cookie:

document.cookie = "TEST=1; expires=Tue, 14 Oct 2014 20:23:32 GMT; path=/"

之后立即将document.cookie放入控制台会显示结果,就好像我没有做任何更改一样。刷新页面时,cookie不在那里,所以它报告正确,只是设置不正确。

如果他打开一个新的隐姓埋名窗口,为其他人工作,上述代码就会起作用。我使用开发工具删除了他的所有cookie,但手动设置cookie仍然没有成功(尽管其他cookie会通过服务器标头设置)。

一旦他重新启动Chrome,它就开始正常运行,所以他似乎遇到了一些无法再复制的怪癖或错误。

有其他人碰到过这个吗?到目前为止,我正在考虑检查document.cookie在设置后是否报告了预期内容,然后在用户禁用cookie时启动我们的无Cookie流,因为情况不匹配。我讨厌这样做,所以任何建议/答案都会很棒。

cookie的工作方式有点奇怪,至少在Chrome中是这样。

如果需要更改cookie的值,则需要逐个添加/设置每个键。

在你的控制台上试试这个:

document.cookie; // -> "expires=Tue, 14 Oct 2014 20:23:32 GMT; path=/"
document.cookie = 'TEST=1';
document.cookie; // -> "TEST=1; expires=Tue, 14 Oct 2014 20:23:32 GMT; path=/"

是的,它添加了密钥,而不是用TEST=1替换整个cookie。

如果您需要移除密钥,您可以简单地不提供任何值:TEST=

我希望这能让你摆脱饼干噩梦(这是给我的)。

确保在服务器(至少是本地服务器)上运行它,以便document.cookie正常工作。

如果您在浏览器中本地运行此文件。"document.cookie"不起作用。

正如另一位用户所提到的,您必须逐一设置它们。这些函数在解析&应用cookie字符串:

function clearCookies(){
    var cookies = document.cookie.split(';');
    for(i in cookies){
        var vals = cookies[i].split('=');
        var name = vals.shift(0, 1).trim();
        document.cookie = name+'=';
    }
}
function parseCookies(cookie){
    clearCookies();
    var cookies = cookie.split(';');
    for(i in cookies){
        var vals = cookies[i].split('=');
        var name = vals.shift(0, 1).trim();
        document.cookie = name+'='+vals.join('=');
    }
}

您必须设置域!

function setCookie(cname, cvalue, exdays) {
  const d = new Date();
  d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
  let expires = "expires=" + d.toUTCString();
  document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/;domain=" + 
  window.location.hostname;
}

为cookie设置的过期日期可能是个问题。我以前在Chrome上遇到过这样的问题。将日期设置为当前或将来的日期,并测试它是否有效。也许Chrome就是这样设计的。

不久前,我们在工作中也遇到了同样的问题,在我们的情况下,只有当我们在本地环境中工作时才会发生这种情况,经过研究,我们看到了一篇文章,说浏览器在localhost:3000上有某种问题,因为它识别为不安全的页面或类似的东西。我们只是通过将localhost:3000替换为127.0.0.1:3000(我认为ip取决于您的配置)进行了修复,在我们替换后,它可以完美地工作。我希望它能帮助你。