2

当我第一次创建 cookie 时,我似乎无法获取相同的 cookie,直到随后的页面加载。就好像在第二次请求页面之前,浏览器不存在 cookie。

我正在使用 Kohana PHP 框架:

Cookie::set('new_cookie', 'I am a cookie');
$cookie = Cookie::get('new_cookie');
//$cookie is NULL the first time this code is run. If I hit the page again
and then call Cookie:get('new_cookie'), the cookie's value is read just fine.

所以,我被引导相信这是正常行为,我可能不明白 cookie 是如何工作的。任何人都可以为我澄清这一点吗?

4

5 回答 5

9

Cookies 设置在 HTTP 标头中,因此当服务器返回页面时。当您重新加载页面时,您的浏览器会将它们发送回服务器。

因此,在新请求之后它们“可见”是完全正常的。

这是来自服务器的示例响应:

HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: name=value
Set-Cookie: name2=value2; Expires=Wed, 09-Jun-2021 10:18:14 GMT

(content of page)

当您重新加载页面时,您的浏览器会发送以下信息:

GET / HTTP/1.1
Host: www.example.org
Cookie: name=value; name2=value2
Accept: */*

这就是为什么服务器只能在浏览器发出新请求后才能看到它们的原因。

于 2012-12-04T16:48:05.737 回答
2

您假设 cookie 在下一页加载之前不可用是正确的。Cookie 存储在浏览器中,并在文档发送到客户端后创建。当客户端再次加载(或重新加载)您的任何页面时,任何现有的 cookie 将与页面请求一起发送到服务器。

于 2012-12-04T16:49:56.327 回答
1

是的,cookie 只能在后续页面加载时访问,因为在您设置 cookie 之前填充了 $_COOKIE 全局变量。

编辑:见https://stackoverflow.com/a/7455234/996876

于 2012-12-04T16:49:10.420 回答
0

客户端(浏览器)在对某些请求的响应中看到新的 cookie。然后它在所有后续请求中将其发送到服务器。所以是的,这是正常行为。

于 2012-12-04T16:49:01.397 回答
0

如果你想在第一个 php 页面加载中使用 cookie(用 JS 改变值),你必须在你的 php 代码顶部使用 setcookie。然后创建 cookie 并可以在 JS 中更改值并在第一个 php 页面加载中使用。

例子 :

<?php
   setcookie('testCookie', 'testValue', 0, "/");
?>

<script type="javascript">
   document.cookie = "testCookie=123456;path=/";
</script>

<?php
   echo $_COOKIE['testCookie'];// return 123456
?>

在此示例中,如果您不在 php 代码顶部使用 setcookie,则在第一页加载 $_COOKIE['TestCookie'] 时返回 null。意味着 php 无法达到在 javascript 中更改的 cookie 的值(在第一页加载中)。第二页加载中不存在此问题。

于 2020-12-07T21:26:02.400 回答