浏览器:刷新时 Cookie 丢失

Posted

技术标签:

【中文标题】浏览器:刷新时 Cookie 丢失【英文标题】:Browser: Cookie lost on refresh 【发布时间】:2011-02-01 21:21:04 【问题描述】:

我在 Chrome 浏览器中遇到了我的应用程序的奇怪行为(其他浏览器没有问题)。当我刷新页面时,cookie 被正确发送,但间歇性地,浏览器似乎没有在某些刷新时传递 cookie。

这就是我设置 cookie 的方式:

$identifier = / some weird string /;
$key = md5(uniqid(rand(), true));
$timeout = number_format(time(), 0, '.', '') + 43200;
setcookie('fboxauth', $identifier . ":" . $key, $timeout, "/", "fbox.mysite.com", 0);

这是我用于页眉的:

header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Thu, 25 Nov 1982 08:24:00 GMT"); // Date in the past

您是否发现这里有任何可能影响 cookie 处理的问题?感谢您的任何建议。

EDIT-01:

似乎某些请求没有发送 cookie。这会间歇性地发生,我现在看到 ALL 浏览器的这种行为。有没有人遇到过这种情况?是否存在cookie不会随请求一起发送的情况?

EDIT-02:

这里是 HTTP 标头:

Request Method:GET
Status Code:200 OK

请求标头

Accept:application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Referer:http://fbox.mysite.com/dashboard
User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)
AppleWebKit/532.5 (KHTML, like Gecko)
Chrome/4.1.249.1045 Safari/532.5

响应标题

Cache-Control:no-cache, must-revalidate
Content-Length:8903
Content-Type:text/html
Date:Tue, 06 Apr 2010 09:25:26 GMT
Expires:Thu, 25 Nov 1982 08:24:00 GMT
Last-Modified:Tue, 06 Apr 2010 09:25:26 GMT
Pragma:no-cache
Server:Microsoft-IIS/7.5
X-Powered-By:php/5.3.1 ZendServer

再次感谢任何指导。

【问题讨论】:

查看您的服务器发送的确切 HTTP 标头会非常有帮助,并且知道您在哪个服务器/版本/php 版本上运行它?您能否将这些详细信息以及此命令的结果添加到问题中(前提是您在本地运行 linux 变体): curl -I [url_to_your_app] 你刚刚试过$timeout = time() + 43200; 吗? @Jason:是的,我做到了,但还是一样。 尝试删除 setcookie 的路径和域,看看是否是导致问题的原因。还可以尝试启用 display_errors 并将 error_reporting 设置为 E_ALL 以查看是否有任何不太明显的错误。 @James:我已经添加了 HTTP 信息。请看一看。顺便说一句,该站点位于装有 PHP 5.3.1 的 Windows 机器上。 【参考方案1】:

看到您的标头信息后,我唯一能想到的是 PHP 在您设置 cookie 之前正在输出一些东西。如果是这种情况,setcookie 应该返回 false 并且您将收到警告“无法发送会话 Cookie - 标头已发送” 正如 Bart S. 建议的那样,打开 error_reporting(E_ALL) 并尝试输出 setcookie 的返回值以验证这是不是这样的。

另外,尝试在基本情况下仅使用 setcookie 并仅使用名称和值,然后再次检查响应标头。然后删除除 setcookie 之外的所有代码,如果可行,请使用分而治之的方法将所有代码带回 :)

【讨论】:

哈!我想到了。数据库事务处理程序类在页面之间运行,并在极少数情况下在加载下一页之前引发异常。但是,奇怪的是,即使在处理程序打印出错误之后,标头重定向也能无缝工作。现在我已经修复了我的 db 类,一切看起来都很好。感谢您的提示,这在正确的时刻有所帮助! :)【参考方案2】:

您的应用程序是通过 http 协议还是 file:// 提供服务?

Chrome 不会在本地应用中存储 cookie,这是设计使然。您可以使用命令行开关更改此行为:

--启用文件-cookies

【讨论】:

通过http协议提供服务。我已经完成了所有检查,但仍然无法追踪问题。甚至尝试重新创建整个 cookie 逻辑,但仍然失去持久性。但你的信息很有用。关于 Chrome 的文件 cookie 行为。谢谢你。【参考方案3】:

我以前见过类似的问题。我会仔细检查路径是否正确。

我想 www.domain.comdomain.com 不同,www.domain.com/ 也是如此(带有尾部正斜杠)

除此之外,检查 PHP 是否有权将其会话写入具有适当写入权限的文件(取决于发行版,它是不同的目录,但 phpinfo() 应该告诉您它正在尝试使用哪个目录。)

我以前遇到过这两种情况。第一个没有错误,似乎模仿了您所遇到的情况,第二个给出了某种文件写入访问错误,但如果没有显示错误,您可能看不到。

【讨论】:

感谢您的一些想法。该站点位于 Intranet 中,不会超出其子域。这意味着其中没有 www 或更改子域。对于会话,我重写了 PHP 的会话处理以使用数据库,它可以正常工作。 他似乎没有使用会话,所以这几乎不会影响他的示例。【参考方案4】:

一个问题,一个建议 -

问题 - 你为什么要在 time() 上执行 number_format(...),因为 time() + 43200 应该就足够了。

建议 - 您是否查看过客户端和服务器之间的时钟。由于您只在两者之间给出了 12 小时的差异,因此如果在两台机器之间的 GMT 时间存在较大的时钟偏差或存在分歧,您可能会发现您发送的 cookie 注定要在不久的将来。

【讨论】:

感谢您的回复。该站点位于 Intranet 中,并且所有机器都在同一个办公室中。此外,所有客户端计算机都配置为从时间服务器自动更新时间。所以我可以说,这不是时间问题。【参考方案5】:

您处理 cookie 的方式完全没问题,您的代码似乎一切正常,问题似乎出在 Chrome 上。

虽然 Chrome Issue# 3014 主要处理 Java 小程序,但您似乎正在经历这种情况。

【讨论】:

@Anthony:谢谢你的参考。我尝试了很多搜索,但找不到任何与我的问题相关的 Chrome 问题。我想知道其他网站如何处理他们的 cookie。它们在 Chrome 上仍然运行流畅。 @Nirmal,参考没问题。搜索有点困难,这是我唯一找到的东西。我看到他们的公开赏金,我希望有人能解决你的问题,祝你好运。

以上是关于浏览器:刷新时 Cookie 丢失的主要内容,如果未能解决你的问题,请参考以下文章

Flutter-web:浏览器刷新时提供者状态丢失

Vue Router fullPath 在网络浏览器刷新时丢失

在 Nuxt asyncData 中使用 axios 在浏览器刷新时丢失令牌

cookie中数据无法读取,HttpOnly属性

如何在 Grails 2.0 中创建和检索 Cookie?

Spring Security - 可以恢复丢失的会话吗?