yii2.0 Cookie的存取 以及爲什麼第一次刷新頁面取不到cookie值

Yii2的Cookie主要是通過yii\web\Requestyii\web\Response進行操作

  • 通過\Yii::$app->response->getCookies()->add()添加Cookie
  • 通過\Yii::$app->request->cookies讀取Cookie.

① 添加Cookie

  1. <?php
  2. //第一種方法
  3. $cookie = new \yii\web\Cookie();
  4. $cookie -> name = 'smister'; //cookie的名稱
  5. $cookie -> expire = time() + 3600; //存活的時間
  6. $cookie -> httpOnly = true; //無法通過js讀取cookie
  7. $cookie -> value = 'cookieValue'; //cookie的值
  8. \Yii::$app->response->getCookies()->add($cookie);
  9. //第二種方法
  10. $cookie = new \yii\web\Cookie([
  11. ‘name’ => ‘smister’,
  12. ‘expire’ => time() + 3600,
  13. ‘httpOnly ’ => true,
  14. ‘value’ => ‘cookieValue’
  15. ]);
  16. \Yii::$app->response->getCookies()->add($cookie);
  17. ?>

 讀取Cookie

  1. <?php
  2. $cookie = \Yii::$app->request->cookies;
  3. //返回一個\yii\web\Cookie對象
  4. $cookie->get(‘smister’);
  5. //直接返回Cookie的值
  6. $cookie->getValue(‘smister’); //$cookie[‘smister’] 其實這樣也是可以讀取的
  7. //判斷一個Cookie是否存在
  8. $cookie->has(‘smister’);
  9. //讀取Cookie的總數
  10. $cookie->count();//$cookie->getCount();跟count一樣
  11. ?>

 刪除Cookie

  1. <?php
  2. $cookie = Yii::$app->request->cookies->get(‘smister’);
  3. //移除一個Cookie對象
  4. \Yii::$app->response->getCookies()->remove($cookie);
  5. //移除所有Cookie,目前好像不太好使
  6. \Yii::$app->response->getCookies()->removeAll();
  7. ?>

在這裏給大家普及一個小知識,我們在進行第一次存取cookie的時候,會取不到cookie,必須是第二次刷新頁面,纔可以取到coo

kie,爲什麼呢?

答:使用firefox的firebug查看”網絡“:
 
客戶端:
可以看到,瀏覽器(客戶端)向服務器發出一次請求,發出請求的時候,在請求頭信息中帶上了各種參數,告訴服務器,我要接收什麼樣的文本(Accept)、什麼編碼格式(Accept-Encoding)、什麼語言(Accept-Language)等等,當然,還把Cookie也傳到了服務器(Cookie)。
 
服務器端:
第一步:setcookie('a','value')
因爲cookie是設置在客戶端的,setcookie函數自己並不能設置cookie,它只能通過頭信息的方式告訴瀏覽器說:兄弟,我要設置一個cookie,鍵爲a,值爲value,你在你那裏幫我設置一下。你也可以理解爲:”來,朕今天高興,賞你一個小甜餅“。
 
第二步:$_COOKIE['a']
$_COOKIE['a']很簡單,執行的操作就是在瀏覽器帶過來的cookie字符串中搜索鍵爲a的cookie,並返回它的值
 
 
很明顯,這個”鍵爲a“的cookie不可能找到,因爲客戶端訪問服務器的時候,這個cookie壓根就不存在,而前面第一步設置cookie的頭信息,也還沒有返回給客戶端(php要從上到下把語句執行完纔會返回給客戶端
 
第三步:服務器返回信息
其中,返回的頭信息中帶有”Set-Cookie a=value“,瀏覽器收到這個頭信息,把cookie存放到電腦的某個文件中,對於不同瀏覽器cookie的存放位置貌似不同,這個不在本文的範圍。

 
刷新瀏覽器,再次訪問服務器的時候,同樣,也會把很多頭信息帶給服務器,只不過這次帶過去的cookie中,就多了一個a=value了。所心$_COOKIE['a']自然就能從cookie字符串中找到這個鍵爲a的cookie的值。
發佈了31 篇原創文章 · 獲贊 23 · 訪問量 50萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章