在学习PHP的Cookie概念时,我遇到了w3schools PHP Tutorial的以下声明:
Cookie的值在发送Cookie时会自动进行网址编码,并在收到时自动解码(以防止网址编码,改为使用
setrawcookie()
)
我没有理解这句话的意思。我对以上陈述有疑问:
setrawcookie()
扮演什么角色?我的意思是它实际上做了什么?以下是我尝试理解cookie概念的代码:
<?php
$cookie_name = "user";
$cookie_value = "John Doe";
setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/");
<?php
if(!isset($_COOKIE[$cookie_name])) {
echo "Cookie named '" . $cookie_name . "' is not set!";
} else {
echo "Cookie '" . $cookie_name . "' is set!<br>";
echo "Value is: " . $_COOKIE[$cookie_name];
}
有人请参考上述代码清除我的疑问吗?
答案 0 :(得分:1)
Http cookies是在客户端(浏览器)和网络服务器之间传输的标头。
当您使用setcookie
时,您正在做的是指示PHP解释器在其响应中使用以下格式注入标头:
Set-Cookie:name=value
该cookie将由浏览器存储,并在Cookie请求标头中的未来请求(返回同一主机)中返回,如下所示:
Cookie:name=value;cookie2=value;cookie3=value
通常情况下,转移时你应该对任何特殊字符进行urlencode。假设我想指定一个名为“operator”的cookie,其值为“&gt;”,那么我应该发出这个标题:
Set-Cookie:operator=%3E
当它表示该值自动被urlencoded时,表示您不必担心这一点。你可以这样做:
setcookie('operator', ">");
PHP将直接处理urlencoding,生成正确的标题。
在服务器端,您将在$_COOKIES
超全局中收到Cookie,与$_GET
和$_POST
相同,系统会自动为您解码值。因此,如果客户返回之前设置的Cookie %3E
,您会在代码中看到:>
。
如果您使用浏览器检查器,则可以在任何请求 - 响应中看到相关标头。 E.g:
请求(返回Cookie)
响应(设置Cookie)
setrawcookie
,也是如此,但您必须自己进行urlencode。来自文档:
setrawcookie()与setcookie()完全相同,只是在发送到浏览器时,cookie值不会自动进行urlencoded。
更有可能的是,您没有任何理由直接使用setrawcookie
。
答案 1 :(得分:1)
从哪里发送cookie给谁以及从谁那里收到cookie?
最初,cookie将从服务器发送到浏览器。在每个后续请求中,浏览器都会将其发送回服务器。
通过“发送cookie时cookie的值自动进行URL编码,并在收到时自动解码”实际发生了什么?
Cookie中可以显示哪些字符有限制。 URL编码将这些字符转换为不同的表示,以使它们有效。
您不需要自己执行此操作,因为PHP setcookie
方法将为您执行此操作,$_COOKIE
变量将在您的代码与其交互时包含已解码的版本。< / p>
setrawcookie()扮演什么角色?我的意思是它实际上做了什么?
它允许您设置没有该编码的cookie(因此您必须手动编码)。您可能永远不需要使用它。