2015-10-27 44 views
8
設置

我在設置一個網頁的Cookie/JS/site.js:Yii2:如何讀取cookie,它是由JavaScript

$.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被保護):

3976220a3c8e46bb641aef1da3accfb1652bffd5bb9de503a9d6882e8a69f6f9a%3A2%3A%7Bi%3A0%3Bs%3A7%3A%22sidebar%22%3Bi%3A1%3Bs%3A6%3A%22hidden%22%3B%7D 

這樣的cooki e可以讀取Yii請求組件。但它可以讀取不受保護的Cookie嗎?

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

+1

有一個JavaScript API,可以讀取由Yii2保護的Cookie:https://github.com/Requilence/yii2-js-cookie但API無法設置cookie,因爲「您無法設置受保護的cookie在JS中由於簽名算法的實現將在客戶端不安全「。 –

+0

已嘗試此i \ Yii :: $ app-> getRequest() - > getCookies() - > has('cookie_name');檢查 –

+0

@NuriddinRashidov是的,我試過了:if(Yii :: $ app-> getRequest() - > getCookies() - > has('sidebar')){...(在幾個變體中)。而且我也嘗試通過var_dump(Yii :: $ app-> request-> cookies)查看所有cookie;但沒有積極的結果。 –

回答

3

要讀取一個cookie的Java腳本設置,你有,在配置,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'); 

警告!

上述解決方案可能有安全問題,因爲我們取消了所有Cookie的enableCookieValidationenableCsrfValidation。因此,還有另一種解決方案可以跳過針對特定cookie的驗證,假設我們剛剛在上面的示例中使用了theme cookie,我們將利用getValue()方法的第二個參數,即默認值,如下所示:

Yii::$app->getRequest()->getCookies()->getValue('theme', (isset($_COOKIE['theme']))? $_COOKIE['theme']: 'theme') 

上述解決方案將讓你保留兩個,enableCookieValidationenableCsrfValidationtrue,只有繞過它們特定的Cookie。