Session 及 Cookie 應用與介紹
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
use Illuminate\Support\Facades\Cookie;
Cookie::queue('hi', 'Hello', 30);
這個方法可以不必搭配 response 來使用,他會自動回傳 cookie。
刪除 Cookie
Cookie::queue(Cookie::forget('asd'));
未雜湊的 Cookie
class EncryptCookies extends Middleware {
/** * The names of the cookies that should not be encrypted. * * @var array */
protected $except = [ 'asd' ];
}