2015-10-27 17 views
8

tôi đặt một cookie trong web/js/site.js:Yii2: Làm thế nào để đọc một cookie, được thiết lập bởi JavaScript

$.cookie("sidebar", "hidden", { path: '/' }); 

tôi đọc cookie với PHP:

$sidebar_toggle_state = $_COOKIE['sidebar']; 

Có thể sử dụng Thành phần Yêu cầu Yii để đọc các cookie đó không? Các mã sau đây không đọc cookie:

$sidebar_toggle_state = Yii::$app->request()->cookies()->getValue('sidebar', ''); 

Xem: http://www.yiiframework.com/doc-2.0/guide-runtime-sessions-cookies.html#cookies

Khi tôi đặt một cookie mới thông qua phần đáp ứng Yii:

Yii::$app->response->cookies->add(new yii\web\Cookie([ 
    'name' => 'sidebar', 
    'value' => 'hidden', 
])); 

Sau đó, giá trị của vẻ Cookie như thế này (vì cookie được bảo vệ):

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

cooki như vậy e có thể đọc thành phần yêu cầu Yii. Nhưng nó có thể đọc các cookie không được bảo vệ không?

Hoặc, có thể đặt các cookie được bảo vệ Yii bằng JavasSript/jQuery (không sử dụng AJAX) không?

+1

Có API JavaScript, cho phép đọc cookie được Yii2 bảo vệ: https://github.com/Requilence/yii2-js-cookie Nhưng API không thể đặt cookie, vì "Bạn không thể đặt cookie được bảo vệ trong JS vì thuật toán ký tên sẽ không an toàn ở phía máy khách ". –

+0

đã thử i \ Yii này :: $ app-> getRequest() -> getCookies() -> has ('cookie_name'); để kiểm tra –

+0

@NuriddinRashidov Có, tôi đã thử: if (Yii :: $ app-> getRequest() -> getCookies() -> có ('sidebar')) {... (trong một số biến thể). Và tôi cũng đã cố gắng xem tất cả cookie bằng var_dump (Yii :: $ app-> request-> cookies); Nhưng không có kết quả tích cực. –

Trả lời

3

Để đọc một cookie được thiết lập bởi Javascript, bạn có, trong các cấu hình, config/web.php để thiết lập một số yêu cầu thành phần thuộc tính được false như sau:

'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, 
     ], 

này sẽ cho phép đọc các tập tin cookie đã được thiết lập sử dụng Javascript như sau:

Yii::$app->getRequest()->getCookies()->getValue('theme'); 

Cảnh báo!

Giải pháp trên có thể có vấn đề bảo mật, bởi vì chúng tôi đã hủy enableCookieValidationenableCsrfValidation cho tất cả cookie. Vì vậy, có một giải pháp khác cho phép nhảy các xác thực đó cho cookie cụ thể, giả sử cookie theme mà chúng tôi vừa sử dụng trong ví dụ trên, chúng tôi sẽ sử dụng tham số thứ hai của phương pháp getValue(), tức là giá trị mặc định, như sau:

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

Các giải pháp trên sẽ cho phép bạn giữ cả hai, enableCookieValidationenableCsrfValidationtrue và chỉ bỏ qua chúng cho một cookie cụ thể.

Các vấn đề liên quan