Laravel 入門 — Session 及 Cookie 應用與介紹

碼農思考中 - Ted
5 min readJul 18, 2023

--

Session 與 Cookie 是什麼?

HTTP 是一個無狀態通訊協定,每一次連線都是新的工作階段,所以如果要儲存資料要使用 Session 或是 Cookie,例如將一個商品放入購物車,當你刷新頁面或轉跳到其他頁面時卻還能看到購物車的商品,這時候就是用 Session 或者 Cookie 儲存的。

Session V.S. Cookie

Session 是儲存在伺服器端,而 Cookie 是儲存在使用者的瀏覽器中。

設定 Session

開始之前,一樣先到 .env 去設定有關 Session 的項目~

SESSION_DRIVER=file SESSION_LIFETIME=120

SESSION_DRIVER

選擇 Session 存在何處, DRIVER可用的參數有:

  • file — 將Session保存為檔案,存在 storage/framework/sessions 中。
  • cookie — 將 Session 保存在安全加密的Cookie 中。
  • database — 將 Session 保存在關聯資料庫中。
  • memcached/ redis- 將 Session 保存在其中一個快速且基於緩存的存儲系統中。
  • array — 將Sessions 保存在PHP 陣列中,不會被持久化。

SESSION_LIFETIME

設定 Session 的生命週期。

儲存 Session

在 laravel 當中, Session 可以透過全域方法 session() 或是 Request 實例來操作。

// 全域方法 
session(['username' => 'data']);
//Request 實例
$request->session()->put('username', 'data');

取得 Session

// 全域方法 
session('username', 'default');
// Request 實例
$request->session()->get('username', 'default');

如果是空的,可以給予預設值。

判斷 Session 是否存在

// request 實例 
if ($request->session()->has('username')) { // }

這個方法只有在 request 實例當中有,如果你使用 session() 方法可以直接取出判斷值是否存在。

刪除所有 Session

// 全域方法 
session()->flush()
// Request 實例
$request->session()->flush();

刪除特定 Session

//全域方法 
session()->forget('username')
// Request 實例
$request->session()->forget('username');

儲存 Cookie

Cookie 使用前基本上不用設定,但記得引入命名空間!

use Illuminate\Support\Facades\Cookie;
Cookie::queue('hi', 'Hello', 30);

這個方法可以不必搭配 response 來使用,他會自動回傳 cookie。

但請別忘記 Cookie 是隨著 response 一起回傳的,因為 Cookie 儲存於使用者的瀏覽器。

刪除 Cookie

Cookie::queue(Cookie::forget('asd'));

未雜湊的 Cookie

laravel 預設的 cookie 都是被雜湊過的

如果要不雜湊 cookie ,可以修改 app/Http/Middleware/EncryptCookies.php 的 $except 屬性,將 cookie 的 key 寫進去即可。

class EncryptCookies extends Middleware { 
/** * The names of the cookies that should not be encrypted. * * @var array */
protected $except = [ 'asd' ];
}

再次重設 Cookie 時,就可以看到 Cookie 以明文的方式儲存了。

Session 及 Cookie 是網頁程式設計中很常用到的兩種東西,大致上介紹到這裡。下一篇文章會介紹 GET 、POST 方法取值。

Originally published at https://studio-44s.tw.

--

--

碼農思考中 - Ted

全端工程師,Asp.Net 、PHP Laravel、ReactJS,隨手記錄各種技術、生活心得與設計靈感,目前文章從舊有網站「筆記長也」搬移過來。https://studio-44s.tw/