yii2
Småkakor
Sök…
Anmärkningar
Cookies är en del av HTTP-förfrågan så det är en bra idé att göra både i controller som ansvar exakt hanterar begäran och svar.
Ställer in en cookie
För att ställa in en cookie, dvs för att skapa den och schema för att skicka till webbläsaren, måste du skapa en ny \yii\web\Cookie
klassinstans och lägga till den i svarskakasamlingen:
$cookie = new Cookie([ 'name' => 'cookie_monster', 'value' => 'Me want cookie!', 'expire' => time() + 86400 * 365, ]); \Yii::$app->getResponse()->getCookies()->add($cookie);
I ovanstående överför vi parametrar till konstruktören för cookie class. Dessa är i princip samma som används med infödd PHP setcookie- funktion:
-
name
- kakans namn. -
value
- värdet på kakan. Se till att det är en sträng. Webbläsare är vanligtvis inte nöjda med binära data i kakor. -
domain
- domän du ställer in cookien för. -
expire
- unix tidsstämpel som anger tid när cookien ska raderas automatiskt. -
path
- sökvägen på servern där cookien kommer att finnas tillgänglig på. -
secure
- om det ärtrue
kommer cookie bara att ställas in om HTTPS används. -
httpOnly
- om det ärtrue
kommer cookie inte att vara tillgänglig via JavaScript.
Läser en cookie
För att läsa en cookie använder du följande kod:
$value = \Yii::$app->getRequest()->getCookies()->getValue('my_cookie');
Obs! Den här koden tillåter lästa cookies som har ställts in med cookie-komponenten (eftersom den som standard undertecknar alla cookies). Om du lägger till / uppdaterar cookie med JS-kod kan du därför inte läsa den med den här metoden (som standard).
Cookies för underdomäner
På grund av säkerhetsskäl är kakor som standard bara tillgängliga på samma domän som de ställts in från. Om du till exempel har ställt in en cookie på domän example.com
kan du inte få den på domän www.example.com
. Så om du planerar att använda underdomäner (dvs. admin.example.com, profile.example.com), måste du ange domain
uttryckligen:
$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 cookie läsas från alla underdomäner på example.com
.
Autentiserings- och identitetskakor över tvärdomäner
I fallet med autologin eller "kom ihåg mig" -kakan gäller samma gränser som för underdomänskakor. Men den här gången måste du konfigurera användarkomponent, ställa in identityCookie
array till önskad cookie-konfigurering.
Öppna din programkonfigurationsfil och lägg till parametrar för identityCookie
i konfigurationen av användarkomponenter:
$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, ], ], ], ];
Observera att cookieValidationKey
ska vara densamma för alla underdomäner.
Observera att du måste konfigurera egenskapen session::cookieParams
att ha samedomainen som din user::identityCookie
att säkerställa login
och logout
för alla underdomäner. Detta beteende förklaras bättre i nästa avsnitt.
Session cookie-parametrar
Parametrar för sessionskakor är viktiga både om du har ett behov av att underhålla sessionen medan du kommer från ett underdomän till ett annat eller när du tvärtom är värd för backend-appen under /admin
URL och vill hantera sessionen separat.
$config = [ // ... 'components' => [ // ... 'session' => [ 'name' => 'admin_session', 'cookieParams' => [ 'httpOnly' => true, 'path' => '/admin', ], ], ], ];