【问题标题】:Cookies don't update on some android browsersCookie 不会在某些 Android 浏览器上更新
【发布时间】:2014-06-05 17:14:07
【问题描述】:

我开发了一个两步验证登录,它使用 cookie 来检查设备是否已经过验证:此 cookie 包含一个唯一的 ID 和一个随机密码,每次访问设备时都会更改。 为了进行更新,我使用了这个 php 代码

setcookie('nameofthecookie', '', time()-600,"/");
setcookie('nameofthecookie', $newcookiecontent, time()+2629743,"/");

这在大多数浏览器上都能完美运行,但在某些安卓浏览器上却不行:事实上,使用它们,cookie 不会更新。

我尝试做的事情:

  1. 仅使用创建 cookie

    setcookie('nameofthecookie', $newcookiecontent, time()+2629743,"/");

    并且它有效;

  2. 仅使用删除 cookie

    setcookie('nameofthecookie', '', time()-600,"/");

    并且它有效

谁能给我一个解决方案?

【问题讨论】:

  • 不要使用“接近”的相对时间来使 cookie 过期。您取决于用户的时钟是否相对准确。始终使用“遥远”的时间,例如时间 = 1(1970 年 1 月 1 日上午 00:00:01)。如果任何人的时间已经过得太远以至于他们已经回到了 70 多岁,那么他们应该没有正常工作
  • 感谢您的评论,我正在按照您的建议更新我的代码。所以正确的代码是 setcookie('nameofthecookie', '', time(1),"/"); ?

标签: php android cookies


【解决方案1】:

您的代码导致发送给客户端的以下标头:

Set-Cookie nameofthecookie=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/ 
           nameofthecookie=somevalue; expires=Sat, 24-May-2014 22:11:13 GMT; Max-Age=2629743; path=/

基于RFC for HTTP Cookies(第9页),没有定义如果路径相同,浏览器将选择哪一个cookie:

如果多个 cookie 满足上述条件,它们将按顺序排列
Cookie 标头,以便具有更具体 Path 属性的那些
在那些不太具体的人之前。相对于其他的排序
属性(例如,域)未指定。

因此,也许 Android 浏览器选择了 emtpy 值的 cookie,而您的桌面浏览器选择了后者。 Netscape specification for cookies 声明

相同路径和名称的实例将相互覆盖, 最新的实例优先。相同路径的实例,但 不同的名字会增加额外的映射。

实际上,您无需在设置新值之前将 cookie 重置为空白值。只需删除代码的第一行。

有关使用 PHP 管理 cookie 的更多信息,请参阅this tutorial

【讨论】:

    猜你喜欢
    • 2021-03-14
    • 1970-01-01
    • 2012-11-07
    • 2016-08-08
    • 2016-10-28
    • 2014-09-14
    • 1970-01-01
    • 2013-06-28
    • 2017-10-07
    相关资源
    最近更新 更多