为啥设置 document.cookie 在 Chrome 中不起作用?

Posted

技术标签:

【中文标题】为啥设置 document.cookie 在 Chrome 中不起作用?【英文标题】:Why would setting document.cookie not work in Chrome?为什么设置 document.cookie 在 Chrome 中不起作用? 【发布时间】:2014-12-08 13:16:13 【问题描述】:

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

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

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

如果他打开一个新的隐身窗口并为其他所有人工作,上面的代码就可以工作。我使用开发工具删除了他的所有 cookie,但手动设置 cookie 仍然没有运气(尽管其他人会回来通过服务器标头设置)。

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

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

【问题讨论】:

“如果它不能被可靠地复制,这不是一个错误”。 每次浏览器重启前都会重现。这让我担心世界上的另一个用户会遇到这种情况,效果很差。开发人员会考虑重新启动浏览器,但我不知道用户会这样做。这可能是向 Chrome 报告的错误,但我还没有足够的信息,这就是为什么我想知道是否有其他人遇到过这个问题。 【参考方案1】:

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

如果您需要更改 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=

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

【讨论】:

谢谢,这很有用。这有什么具体原因吗? @cst1992 真诚地我不知道。但我想这是一些早期的实施,它是匆忙做出的,就像当时的许多事情一样:) 实际上已经尝试过了,我必须说,执行TEST= 仍然会留下一个条目,尽管它是一个空值。转到浏览器的 cookie 存储并从那里删除将删除键和值。 @cst1992:如果在本地将TEST 保留为空字符串,Chrome 是否实际上将其发送而不发送到服务器会很有趣(我只是没时间做这个小测试)。【参考方案2】:

正如另一位用户提到的,您必须一一设置它们。这些函数可用于解析和应用 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('=');
    

【讨论】:

【参考方案3】:

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

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

【讨论】:

回复有点晚我知道,但是cookies是http相关的,如果你在本地查看而不使用XAMPP之类的服务器,那么你将无法生成cookies。但是,如果您也想要离线工作的东西,您可以随时考虑使用 localStorage developer.mozilla.org/en-US/docs/Web/API/Window/localStorage【参考方案4】:

为 cookie 设置的到期日期可能是问题所在。我之前在 Chrome 上遇到过这样的问题。将日期设置为现在或将来的日期并测试它是否有效。可能这就是 Chrome 的设计方式。

【讨论】:

以上是关于为啥设置 document.cookie 在 Chrome 中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥没有在新标签页控制台中设置 document.cookie?

无法在 Phonegap iOS 的 document.cookie 中设置域?

document.cookie的使用

关于document.cookie的使用

关于document.cookie的使用

Chrome中奇怪的document.cookie行为[重复]