我使用此代码在以下位置设置 cookie Yii2:
$cookies = Yii::$app->response->cookies;
$cookies->add(new \yii\web\Cookie([
'name' => 'googtrans',
'value' => '//fa',
'expire' => time()+(60*60*24*365),
]));
Run Code Online (Sandbox Code Playgroud)
当我在浏览器中检查 cookie 管理器时,我看到:
378abb4ba4b3ed4bd5fa0918a34e0ba6c4042aecd590d167d76f6a901660d082a%3A2%3A%7Bi%3A0%3Bs%3A9%3A%22googtrans%22%3Bi%3A1%3Bs%3A4%3A%22%2F%2Ffa%22%3B%7D
Run Code Online (Sandbox Code Playgroud)
解码后我看到:
378abb4ba4b3ed4bd5fa0918a34e0ba6c4042aecd590d167d76f6a901660d082a:2:{i:0;s:9:"googtrans";i:1;s:4:"//fa";}
Run Code Online (Sandbox Code Playgroud)
似乎,Yii2将 cookie 数据JSON自动转换为格式。
但我不需要这个,我想要一个简单的 cookie 值,带有googtrans名称和//fa值。
(我知道$_COOKIE在 PHP 核心,但我想使用 Yii)
我该怎么做?
不是JSON。它在散列之前使用 PHP 的序列化方法:
// retrieved from yii\web\Response::sendCookies()
$value = $cookie->value;
if ($cookie->expire != 1 && isset($validationKey)) {
$value = Yii::$app->getSecurity()->hashData(serialize([$cookie->name, $value]), $validationKey);
}
setcookie($cookie->name, $value, $cookie->expire, $cookie->path, $cookie->domain, $cookie->secure, $cookie->httpOnly);
Run Code Online (Sandbox Code Playgroud)
在此处查看完整代码。
事情是每当$enableCookieValidation设置为 true(默认情况下就是这种情况)时,Yii 都会这样做来验证接收到的 cookie 是否被篡改。
因此,您可能希望使用这些配置完全禁用内置 Cookie 验证:
'request' => [
'enableCookieValidation' => false,
'enableCsrfValidation' => false,
]
Run Code Online (Sandbox Code Playgroud)
但我不推荐它,因为有安全原因以这种方式构建它。要在 Yii 应用程序内的任何位置解码 cookie 的值,您始终可以按照官方文档中的说明进行操作:
$cookies = Yii::$app->request->cookies;
if (($cookie = $cookies->get('googtrans')) !== null) {
$googtrans = $cookie->value;
}
Run Code Online (Sandbox Code Playgroud)
否则,如果您需要的是客户端能够读取某些 cookie 的实际值,我建议您$_COOKIE改用它的创建者在此处推荐的直接设置/获取它。