Contents

PHP JAVA Session 處理機制

小記

HTTP Session 的基本概念

HTTP 是一個**無狀態(Stateless)**的協定,每次請求之間彼此獨立,伺服器無法自動辨認兩次請求是否來自同一個使用者。Session 機制就是為了解決這個問題而生。

Session 的核心概念:

  1. 使用者首次訪問時,伺服器建立一個唯一的 Session ID
  2. Session ID 透過 Cookie(或 URL 參數)傳給瀏覽器
  3. 瀏覽器後續每次請求都帶上此 Session ID
  4. 伺服器根據 Session ID 查找對應的 Session 資料(存在記憶體或檔案中)
  5. 以此識別使用者的狀態(例如:是否已登入、購物車內容等)

PHP Session 機制

基本使用

PHP 提供內建的 Session 支援,使用非常簡單:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?php
// 開啟 Session(每個需要使用 Session 的頁面都要呼叫)
session_start();

// 寫入 Session 資料
$_SESSION['user_id'] = 123;
$_SESSION['username'] = 'Alice';

// 讀取 Session 資料
echo $_SESSION['username']; // 輸出:Alice

// 刪除特定 Session 變數
unset($_SESSION['username']);

// 銷毀整個 Session(登出時使用)
session_destroy();
?>

運作機制

  1. session_start() 被呼叫時,PHP 會:
    • 讀取請求中的 Cookie(預設名稱為 PHPSESSID
    • 若無 Cookie,則建立新的 Session ID 並透過 Set-Cookie 回應標頭傳給瀏覽器
  2. Session 資料預設以檔案形式存在伺服器的 /tmp 目錄(可透過 session.save_path 設定)
  3. 每個 Session 檔案以 Session ID 命名,例如:sess_abc123xyz

Session 設定

可在 php.ini 或程式中調整 Session 行為:

1
2
3
4
5
// 設定 Session 過期時間(秒)
ini_set('session.gc_maxlifetime', 3600);

// 設定 Session Cookie 的有效時間
session_set_cookie_params(3600);

Java Servlet Session 機制

基本使用

Java Web 應用透過 HttpSession 介面管理 Session:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import javax.servlet.http.HttpSession;

// 取得 Session(若不存在則建立新的)
HttpSession session = request.getSession();

// 寫入 Session 資料
session.setAttribute("userId", 123);
session.setAttribute("username", "Alice");

// 讀取 Session 資料
String username = (String) session.getAttribute("username");

// 設定 Session 過期時間(秒)
session.setMaxInactiveInterval(1800);

// 移除特定屬性
session.removeAttribute("username");

// 銷毀 Session
session.invalidate();

運作機制

  1. 第一次呼叫 request.getSession() 時,Servlet 容器(Tomcat)建立新的 HttpSession 物件,並生成唯一的 Session ID(JSESSIONID
  2. Session ID 預設透過 Cookie 傳遞,Cookie 名稱為 JSESSIONID
  3. 若瀏覽器禁用 Cookie,Servlet 支援 URL Rewriting,將 Session ID 附加在 URL 中:
    1
    
    http://example.com/page;jsessionid=ABC123
    
    可用 response.encodeURL(url) 自動處理
  4. Session 資料存放在 JVM 記憶體中(單機),叢集環境需要外部 Session 存儲(Redis、資料庫)

PHP vs Java Session 比較

特性 PHP Java (Servlet)
Session ID Cookie 名稱 PHPSESSID JSESSIONID
預設存儲位置 檔案系統(/tmp) JVM 記憶體
啟動方式 session_start() request.getSession()
URL Rewriting 支援 支援(encodeURL()
叢集 Session 共享 需設定 Redis/Memcached 需設定外部 Session Store
過期設定 gc_maxlifetime setMaxInactiveInterval()

參考資料