我使用以下代码在Yii2
中设置cookie:
$cookies = Yii::$app->response->cookies;
$cookies->add(new \yii\web\Cookie([
'name' => 'googtrans',
'value' => '//fa',
'expire' => time()+(60*60*24*365),
]));
当我在浏览器中检查cookie管理器时,会看到以下内容:
378abb4ba4b3ed4bd5fa0918a34e0ba6c4042aecd590d167d76f6a901660d082a%3A2%3A%7Bi%3A0%3Bs%3A9%3A%22googtrans%22%3Bi%3A1%3Bs%3A4%3A%22%2F%2Ffa%22%3B%7D
解码后,我看到:
378abb4ba4b3ed4bd5fa0918a34e0ba6c4042aecd590d167d76f6a901660d082a:2:{i:0;s:9:"googtrans";i:1;s:4:"//fa";}
似乎Yii2
自动将cookie数据转换为JSON
格式。
但是我不需要这个,我想使用一个googtrans
名称和//fa
值的cookie值。
(我了解PHP核心中的$_COOKIE
,但我想使用Yii)
我该怎么做?
参考方案
不是JSON。它在散列之前使用PHP的serialize方法:
// 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);
参见完整代码here。
事实是,只要$enableCookieValidation设置为true(默认情况下就是这种情况),Yii就会这样做以验证接收到的cookie是否受到篡改。
因此,您可能需要使用这些配置完全禁用内置的Cookie验证:
'request' => [
'enableCookieValidation' => false,
'enableCsrfValidation' => false,
]
但是我不推荐使用它,因为出于安全原因需要以这种方式进行构建。要在Yii应用程序中的任何位置解码cookie的值,您始终可以按照official docs中的说明进行操作:
$cookies = Yii::$app->request->cookies;
if (($cookie = $cookies->get('googtrans')) !== null) {
$googtrans = $cookie->value;
}
否则,如果您需要的是客户端能够读取某些cookie的真实值,那么我建议使用$_COOKIE
来直接设置/获取它,正如其创建者here所建议的那样。
举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…
PHP:对数组排序 - php请如何排序以下数组Array ( 'ben' => 1.0, 'ken' => 2.0, 'sam' => 1.5 ) 至Array ( 'ken' => 2.0, 'sam' => 1.5, 'ben' =&…
PHP strtotime困境 - php有人可以解释为什么这在我的服务器上输出为true吗?date_default_timezone_set('Europe/Bucharest'); var_dump( strtotime('29.03.2015 03:00', time()) === strtotime('29.03.2015 04:00…
PHP-全局变量的性能和内存问题 - php假设情况:我在php中运行一个复杂的站点,并且我使用了很多全局变量。我可以将变量存储在现有的全局范围内,例如$_REQUEST['userInfo'],$_REQUEST['foo']和$_REQUEST['bar']等,然后将许多不同的内容放入请求范围内(这将是适当的用法,因为这些数据指的是要求自…
PHP PDO组按列名称查询结果 - php以下PDO查询返回以下结果:$db = new PDO('....'); $sth = $db->prepare('SELECT ...'); 结果如下: name curso ABC stack CDE stack FGH stack IJK stack LMN overflow OPQ overflow RS…