我在web/js/site.js中设置了一个cookie:
$.cookie("sidebar", "hidden", { path: '/' });我用PHP阅读了cookie:
$sidebar_toggle_state = $_COOKIE['sidebar'];是否也可以使用Yii请求组件来读取这样的cookie?以下代码没有读取cookie:
$sidebar_toggle_state = Yii::$app->request()->cookies()->getValue('sidebar', '');请参阅:http://www.yiiframework.com/doc-2.0/guide-runtime-sessions-cookies.html#cookies
当我通过Yii响应组件设置一个新cookie时:
Yii::$app->response->cookies->add(new yii\web\Cookie([
'name' => 'sidebar',
'value' => 'hidden',
]));然后cookie的值看起来如下(因为cookie是受保护的):
3976220a3c8e46bb641aef1da3accfb1652bffd5bb9de503a9d6882e8a69f6f9a%3A2%3A%7Bi%3A0%3Bs%3A7%3A%22sidebar%22%3Bi%3A1%3Bs%3A6%3A%22hidden%22%3B%7D这样的cookie可以让Yii请求读取组件。但它还能读到没有保护的饼干吗?
或者,是否可以使用JavasSript / jQuery设置Yii保护的cookie(不使用AJAX)?
发布于 2016-10-22 15:00:21
要读取Javascript设置的cookie,您可以在配置中使用config/web.php将一些请求组件属性设置为false,如下所示:
'components' => [
'request' => [
// !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
'cookieValidationKey' => 'SomeRandomStringChars',
'enableCookieValidation' => false,
'enableCsrfValidation' => false,
],这将允许读取使用Javascript设置的cookie,如下所示:
Yii::$app->getRequest()->getCookies()->getValue('theme');警告!
上面的解决方案可能存在安全问题,因为我们取消了所有cookies的enableCookieValidation和enableCsrfValidation。因此,还有另一种解决方案,允许跳过特定cookie的验证,假设我们刚才在上面的示例中使用的theme cookie,我们将使用getValue()方法的第二个参数,即默认值,如下所示:
Yii::$app->getRequest()->getCookies()->getValue('theme', (isset($_COOKIE['theme']))? $_COOKIE['theme']: 'theme')上面的解决方案将允许您将enableCookieValidation和enableCsrfValidation都保持为true,并且只对特定的cookie绕过它们。
https://stackoverflow.com/questions/33362880
复制相似问题