Szukaj…


Uwagi

Pliki cookie są częścią żądania HTTP, więc dobrze jest zrobić to zarówno w kontrolerze, który odpowiada dokładnie za żądanie i odpowiedź.

Aby ustawić plik cookie, tj. Utworzyć go i zaplanować wysyłanie do przeglądarki, musisz utworzyć nową instancję klasy \yii\web\Cookie i dodać ją do kolekcji plików cookie odpowiedzi:

$cookie = new Cookie([
    'name' => 'cookie_monster',
    'value' => 'Me want cookie!',
    'expire' => time() + 86400 * 365,
]);
\Yii::$app->getResponse()->getCookies()->add($cookie);

Powyżej przekazujemy parametry konstruktorowi klasy plików cookie. Te są w zasadzie takie same, jak używane z natywną funkcją setcookie PHP:

  • name - nazwa ciasteczka.
  • value - wartość ciasteczka. Upewnij się, że to ciąg. Przeglądarki zazwyczaj nie są zadowolone z danych binarnych w plikach cookie.
  • domain - domena, dla której ustawiasz ciasteczko.
  • expire - uniksowy znacznik czasu wskazujący, kiedy plik cookie powinien zostać automatycznie usunięty.
  • path - ścieżka na serwerze, na której będzie dostępny plik cookie.
  • secure - jeśli to true , plik cookie zostanie ustawiony tylko wtedy, gdy zostanie użyty HTTPS.
  • httpOnly - jeśli to true , ciasteczko nie będzie dostępne przez JavaScript.

Czytanie ciasteczka

Aby odczytać plik cookie, użyj następującego kodu:

$value = \Yii::$app->getRequest()->getCookies()->getValue('my_cookie');

Uwaga: ten kod pozwala na odczyt plików cookie, które zostały ustawione przy użyciu komponentu cookie (ponieważ domyślnie podpisuje wszystkie pliki cookie). Dlatego jeśli dodasz / zaktualizujesz plik cookie przy użyciu kodu JS, nie będziesz mógł go odczytać przy użyciu tej metody (domyślnie).

Ze względów bezpieczeństwa pliki cookie są domyślnie dostępne tylko w tej samej domenie, w której zostały ustawione. Na przykład, jeśli ustawiłeś plik cookie w domenie example.com , nie możesz go uzyskać w domenie www.example.com . Jeśli więc planujesz użyć poddomen (np. Admin.example.com, profile.example.com), musisz wyraźnie ustawić domain :

$cookie = new Cookie([
    'name' => 'cookie_monster',
    'value' => 'Me want cookie everywhere!',
    'expire' => time() + 86400 * 365,
    'domain' => '.example.com' // <<<=== HERE
]);
\Yii::$app->getResponse()->getCookies()->add($cookie);

Teraz plik cookie można odczytać ze wszystkich poddomen domeny example.com .

W przypadku plików cookie autologin lub „Remember me” obowiązują te same dziwactwa, co w przypadku plików cookie subdomeny. Ale tym razem musisz skonfigurować komponent użytkownika, ustawiając tablicę identityCookie na pożądaną konfigurację plików cookie.

Otwórz plik konfiguracyjny aplikacji i dodaj parametry identityCookie do konfiguracji komponentu użytkownika:

$config = [
    // ...
    'components' => [
        // ...
        'user' => [
            'class' => 'yii\web\User',
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
            'loginUrl' => '/user/login',
            'identityCookie' => [ // <---- here!
                'name' => '_identity',
                'httpOnly' => true,
                'domain' => '.example.com',
            ],
        ],
        'request' => [
            'cookieValidationKey' => 'your_validation_key'
        ],
        'session' => [
            'cookieParams' => [
                'domain' => '.example.com',
                'httpOnly' => true,
            ],
        ],

    ],
];

Pamiętaj, że cookieValidationKey powinien być taki sam dla wszystkich subdomen.

Pamiętaj, że musisz skonfigurować właściwość session::cookieParams aby samedomain był twoim user::identityCookie aby zapewnić login i logout dla wszystkich poddomen. To zachowanie jest lepiej wyjaśnione w następnej sekcji.

Sesyjne parametry plików cookie są ważne zarówno wtedy, gdy trzeba utrzymywać sesję podczas przechodzenia z jednej subdomeny, jak i gdy, przeciwnie, hostujesz aplikację zaplecza pod /admin URL i chcesz osobno obsługiwać sesję.

$config = [
    // ...
    'components' => [
        // ...
        'session' => [
            'name' => 'admin_session',
            'cookieParams' => [
                'httpOnly' => true,
                'path' => '/admin',
            ],
        ],
    ],
];


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow