2015-10-27 4 views
8

ho impostare un cookie nel web/js/site.js:Yii2: Come leggere un cookie, che è stato fissato da JavaScript

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

ho letto il cookie con PHP:

$sidebar_toggle_state = $_COOKIE['sidebar']; 

È possibile utilizzare anche la Componente richiesta Yii per leggere tali cookie? Il seguente codice non legge il cookie:

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

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

Quando ho creato un nuovo cookie attraverso il Yii Componente Risposta:

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

Poi il valore degli sguardi dei cookie come questo (perché il cookie è protetto):

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

Tali cuochi e può leggere il componente di richiesta Yii. Ma può leggere anche i biscotti non protetti?

Oppure, è possibile impostare i cookie protetti Yii con JavasSript/jQuery (senza utilizzare AJAX)?

+1

C'è un'API JavaScript, che consente di leggere i cookie protetti da Yii2: https://github.com/Requilence/yii2-js-cookie Ma l'API non può impostare i cookie, perché "Non è possibile impostare i cookie protetti in JS a causa dell'impostazione dell'algoritmo di firma sarà insicuro sul lato client ". –

+0

hanno provato questo i \ Yii :: $ app-> getRequest() -> getCookies() -> ha ('cookie_name'); per il controllo di –

+0

@NuriddinRashidov Sì, ho provato: if (Yii :: $ app-> getRequest() -> getCookies() -> ha ('sidebar')) {... (in diverse varianti). E ho anche provato a visualizzare tutti i cookie con var_dump (Yii :: $ app-> request-> cookies); Ma senza risultati positivi. –

risposta

3

Per leggere un cookie impostato da JavaScript, avete, in configurazioni, config/web.php per impostare alcune proprietà delle richieste componenti da false simile al seguente:

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

Questo permetterà la lettura di cookie che sono stati impostati utilizzando Javascript come il seguente:

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

Avviso!

La soluzione di cui sopra potete ha problemi di sicurezza, perché abbiamo cancellato il enableCookieValidation e enableCsrfValidation per tutti i cookie. Quindi c'è un'altra soluzione che permette di saltare quelle convalide per un cookie specifico, supponiamo il cookie theme che abbiamo appena usato nell'esempio sopra, utilizzeremo il secondo parametro del metodo getValue(), ovvero il valore predefinito, come il seguente:

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

La soluzione di cui sopra vi lasceranno mantenendo entrambe, enableCookieValidation e enableCsrfValidation essere true e bypassare solo per un cookie specifico.

Problemi correlati