在页面卸载时cookie过期,然后在下一个页面加载时设置cookie

Expiring a cookie on page unload, then setting cookie on next page load

本文关键字:cookie 加载 设置 下一个 过期 卸载 然后      更新时间:2023-09-26

当请求页面时,我在PHP中通过setcookie('animals, json_encode(array('tiger')), time()+(3600*24), '/');设置cookie animals

然后我用

使unload页上的cookie过期:
window.addEventListener('unload', function() {
    document.cookie = 'animals=; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/';
});

设置cookie过期。

问题是,当我刷新页面时,setcookie()试图设置cookie,但浏览器已将cookie设置为过期,因此浏览器在PHP返回时删除cookie,而不是使用新的数据/过期时间。所以cookie被删除了,我不能在页面加载后访问animals

这发生在FF和Chrome。问题只出现在页面刷新上;如果我去一个不同的网站然后回来,或者第一次来到这个页面,cookie是正确设置的。

是否有任何方法可以让浏览器理解不删除cookie,而是使用新的参数?浏览器何时决定删除cookie,为什么不查看来自PHP的新参数?

可能的解决方案(我称之为"hack")是为每个cookie添加唯一标识符(即时间戳),因此animals-1407435704,以便每个页面加载都有自己的cookie。我也可以从PHP回显document.cookie,设置cookie,所以在页面加载后,JS设置cookie。但是,我宁愿看到一个解决方案,指示浏览器不删除cookie。

Update:我要给每个cookie添加一个唯一的标识符,因为我实际上需要考虑多个选项卡正在打开(并允许它们各自存在)。我不知道为什么浏览器会这样做

我认为这个解决方案应该重置cookie:

document.cookie = 'animals=; Max-Age=0'

你能做的就是检查cookie是否存在,然后做出相应的反应。

如果cookie在新加载时仍然存在,则继续检查延迟直到删除,然后再次添加它:

waitToSetCookie(){
    if (checkCookie(animals))
            setTimeout(waitToSetCookie(), 1000);
        else
            setcookie('animals, json_encode(array('tiger')), time()+(3600*24), '/');
}