Yii2:如何读取由JavaScript设置的cookie

Ant*_*ška 9 yii2

我在web/js/site.js中设置了一个cookie:

$.cookie("sidebar", "hidden", { path: '/' });
Run Code Online (Sandbox Code Playgroud)

我用PHP读取了cookie:

$sidebar_toggle_state = $_COOKIE['sidebar'];
Run Code Online (Sandbox Code Playgroud)

是否可以使用Yii请求组件来读取此类cookie?以下代码不读取cookie:

$sidebar_toggle_state = Yii::$app->request()->cookies()->getValue('sidebar', '');
Run Code Online (Sandbox Code Playgroud)

请参阅: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',
]));
Run Code Online (Sandbox Code Playgroud)

然后cookie的值看起来像这样(因为cookie受到保护):

3976220a3c8e46bb641aef1da3accfb1652bffd5bb9de503a9d6882e8a69f6f9a%3A2%3A%7Bi%3A0%3Bs%3A7%3A%22sidebar%22%3Bi%3A1%3Bs%3A6%3A%22hidden%22%3B%7D
Run Code Online (Sandbox Code Playgroud)

这样的cookie可以读取Yii Request Component.但它能读取未受保护的cookie吗?

或者,是否可以使用JavasSript/jQuery(不使用AJAX)设置Yii保护的cookie?

Sai*_*akR 7

要读取由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,
        ],
Run Code Online (Sandbox Code Playgroud)

这将允许读取使用Javascript设置的cookie,如下所示:

Yii::$app->getRequest()->getCookies()->getValue('theme');
Run Code Online (Sandbox Code Playgroud)

警告!

上述解决方案可能有安全问题,因为我们取消了enableCookieValidationenableCsrfValidation所有的cookies.所以有另一种解决方案允许跳过特定cookie的验证,假设theme我们刚刚在上面的例子中使用过的cookie,我们将使用getValue()方法的第二个参数,即默认值,如下所示:

Yii::$app->getRequest()->getCookies()->getValue('theme', (isset($_COOKIE['theme']))? $_COOKIE['theme']: 'theme')
Run Code Online (Sandbox Code Playgroud)

上述解决方案将让你保留两个,enableCookieValidation并且enableCsrfValidationtrue只有绕过它们特定的Cookie.