yii2
koekjes
Zoeken…
Opmerkingen
Cookies maken deel uit van HTTP-verzoek, dus het is een goed idee om zowel in de controller te doen welke verantwoordelijkheid precies betrekking heeft op verzoek en antwoord.
Een cookie instellen
Om een cookie in te stellen, dwz om het te maken en te plannen voor verzending naar de browser, moet u een nieuw \yii\web\Cookie
klasse maken en toevoegen aan de verzameling van responscookies:
$cookie = new Cookie([ 'name' => 'cookie_monster', 'value' => 'Me want cookie!', 'expire' => time() + 86400 * 365, ]); \Yii::$app->getResponse()->getCookies()->add($cookie);
In het bovenstaande geven we parameters door aan de constructeur van de cookieklasse. Deze zijn in principe hetzelfde als gebruikt met de native PHP setcookie- functie:
-
name
- naam van de cookie. -
value
- waarde van de cookie. Zorg ervoor dat het een string is. Browsers zijn meestal niet blij met binaire gegevens in cookies. -
domain
- domein waarvoor u de cookie instelt. -
expire
- Unix-tijdstempel die aangeeft wanneer de cookie automatisch moet worden verwijderd. -
path
- het pad op de server waarop de cookie beschikbaar zal zijn. -
secure
- indientrue
, wordt cookie alleen ingesteld als HTTPS wordt gebruikt. -
httpOnly
- indientrue
, is cookie niet beschikbaar via JavaScript.
Cookie lezen
Gebruik de volgende code om een cookie te lezen:
$value = \Yii::$app->getRequest()->getCookies()->getValue('my_cookie');
Opmerking: met deze code kunnen cookies worden gelezen die zijn ingesteld met behulp van de cookie-component (omdat deze standaard alle cookies ondertekent). Daarom als u cookie toevoegt / bijwerkt met behulp van JS-code, kunt u deze niet lezen met deze methode (standaard).
Cookies voor subdomeinen
Om veiligheidsredenen zijn cookies standaard alleen toegankelijk op hetzelfde domein als waar ze zijn ingesteld. Als u bijvoorbeeld een cookie heeft ingesteld op domein example.com
, kunt u deze niet krijgen op domein www.example.com
. Dus als u van plan bent om subdomeinen te gebruiken (bijv. Admin.example.com, profile.example.com), moet u het domain
expliciet instellen:
$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);
Nu kan de cookie worden gelezen van alle subdomeinen van example.com
.
Cross-subdomein authenticatie en identiteitscookies
In het geval van autologin of "onthoud mij" -cookie gelden dezelfde eigenaardigheden als in het geval van subdomein-cookies. Maar deze keer moet u de gebruikerscomponent configureren en de identityCookie
array instellen op de gewenste cookie-configuratie.
Open het configuratiebestand van uw applicatie en voeg de parameters identityCookie
aan de configuratie van gebruikerscomponenten:
$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, ], ], ], ];
Merk op dat cookieValidationKey
hetzelfde moet zijn voor alle subdomeinen.
Merk op dat u de eigenschap session::cookieParams
moet configureren om session::cookieParams
domein te hebben als uw user::identityCookie
om ervoor te zorgen dat de login
en logout
werken voor alle subdomeinen. Dit gedrag wordt beter uitgelegd in de volgende sectie.
Sessie cookie parameters
Parameters van sessiecookies zijn belangrijk, zowel als u de sessie wilt onderhouden terwijl u van het ene subdomein naar het andere gaat, of wanneer u daarentegen een backend-app host onder /admin
URL en de sessie afzonderlijk wilt afhandelen.
$config = [ // ... 'components' => [ // ... 'session' => [ 'name' => 'admin_session', 'cookieParams' => [ 'httpOnly' => true, 'path' => '/admin', ], ], ], ];