參考文章:[Web] Cookie & Session 介紹
文件:会话
第 17 天:緩存 Cache主要用快取來儲存臨時的數據,從而減少資料庫查詢的次數和提高回應速度。
今天要介紹的是前後端的儲存數據功能:瀏覽器的儲存方法 vs 伺服器的儲存方法
伺服器端
的儲存機制,用於安全地管理使用者會話數據,適用於儲存需要伺服器端處理和保護的敏感資料。客戶端
的儲存機制,適用於儲存不需要高安全性的數據,如使用者設定和快取資訊。會話 Session
是一種在使用者與伺服器之間保持狀態的機制,它使得伺服器能夠記住使用者的某些訊息,跨多個請求或頁面保持資料的持久性。
基本概念
伺服器端
儲存使用者資料的一種機制,資料通常包括使用者的登入狀態、購物車內容等。唯一
的識別碼,就像 Cookie 中的 session_id 可以用來追蹤,客戶端透過這個標識符與伺服器進行通信,伺服器根據標識符查找對應的會話資料。在 Laravel 中,會話配置和使用可以透過設定檔來定義會話的儲存驅動、過期時間等,並在控制器中進行資料的儲存和存取。
配置會話
config/session.php
設定檔中,可以設定會話的相關選項:
driver
):定義會話資料的儲存方式。可選值包括 file
, cookie
, database
, redis
, memcached
, array
。lifetime
):會話的過期時間(分鐘)。secure
):指定是否使用 HTTPS 傳輸會話 Cookie。domain
):Cookie 的域名。file
):預設驅動,資料儲存在 storage/framework/sessions
目錄中,適用於中小型應用,簡單易用。cookie
):將會話資料直接儲存在客戶端的 Cookie 中,適合儲存少量資料。database
):會話資料儲存在資料庫中。需要建立一個會話資料表。適合需要持久化資料的應用。redis
):會話資料儲存在 Redis 資料庫中。適用於高效能、高並發的場景。memcached
):會話資料儲存在 Memcached 中。適用於高效能、高並發的場景。array
):資料儲存在 PHP 數組中,只適用於請求週期內的資料存儲,不適合持久化。// config/session.php
'driver' => env('SESSION_DRIVER', 'file'),
'lifetime' => 120, // Session lifetime in minutes
使用會話
在控制器中使用會話資料:
public function store(Request $request)
{
$request->session()->put('key', 'value');
return redirect()->back()->with('status', 'Data stored in session!');
}
public function show(Request $request)
{
$value = $request->session()->get('key', 'default');
return view('show', ['value' => $value]);
}
// 刪除特定會話項
public function destroy(Request $request)
{
$request->session()->forget('key');
return redirect()->back()->with('status', 'Session data deleted!');
}
// 刪除所有會話數據
public function clear(Request $request)
{
$request->session()->flush();
return redirect()->back()->with('status', 'All session data cleared!');
}
依照文件的範例:使用者登入功能
// 在登入控制器中儲存用戶登入狀態
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
if (Auth::attempt($credentials)) {
$request->session()->put('user', Auth::user());
return redirect()->intended('dashboard');
}
return redirect('login')->withErrors(['error' => 'Invalid credentials']);
}
// 在控制器中讀取使用者資訊
public function dashboard(Request $request)
{
$user = $request->session()->get('user');
return view('dashboard', ['user' => $user]);
}
// 在登出控制器中
public function logout(Request $request)
{
Auth::logout();
$request->session()->flush();
return redirect('login')->with('status', 'Logged out successfully!');
}
第 11 天:用戶認證的每週任務是使用者登入認證。
透過這個認證試著用會話儲存他們的登入狀態,並在整個會話中使用它來顯示歡迎訊息。
step 1 - 配置會話
在 config/session.php
設定驅動。
(預設情況下,Laravel 使用檔案驅動來儲存會話資料。)
// config/session.php
'driver' => env('SESSION_DRIVER', 'file'),
確認 .env
檔案中的 SESSION_DRIVER
設定。
SESSION_DRIVER=file
step 2 - 建立登入表單
<!-- resources/views/auth/login.blade.php -->
<form action="{{ route('login') }}" method="POST">
@csrf
<input type="text" name="username" placeholder="Username" required>
<input type="password" name="password" placeholder="Password" required>
<button type="submit">Login</button>
</form>
step 3 - 處理登入請求
// app/Http/Controllers/AuthController.php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class AuthController extends Controller
{
public function showLoginForm()
{
return view('auth.login');
}
public function login(Request $request)
{
$credentials = $request->only('username', 'password');
if (Auth::attempt($credentials)) {
// 登入成功,將使用者 ID 儲存到會話中
$request->session()->put('user_id', Auth::id());
return redirect()->intended('dashboard');
}
return redirect()->back()->withErrors(['login' => 'Invalid credentials']);
}
public function logout(Request $request)
{
Auth::logout();
$request->session()->flush(); // 清空會話數據
return redirect('/');
}
}
step 4 - 存取會話數據
在應用的其他地方,存取會話資料。例如,在顯示使用者歡迎訊息的控制器中:
// app/Http/Controllers/DashboardController.php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class DashboardController extends Controller
{
public function index(Request $request)
{
$userId = $request->session()->get('user_id');
// 取得使用者資訊(假設有一個 User 模型)
$user = \App\Models\User::find($userId);
return view('dashboard', ['user' => $user]);
}
}
step 5 - 顯示會話數據
<!-- resources/views/dashboard.blade.php -->
<h1>Welcome, {{ $user->name }}</h1>
<form action="{{ route('logout') }}" method="POST">
@csrf
<button type="submit">Logout</button>
</form>