PHP JAVA Session 處理機制
Contents
小記
HTTP Session 的基本概念
HTTP 是一個**無狀態(Stateless)**的協定,每次請求之間彼此獨立,伺服器無法自動辨認兩次請求是否來自同一個使用者。Session 機制就是為了解決這個問題而生。
Session 的核心概念:
- 使用者首次訪問時,伺服器建立一個唯一的 Session ID
- Session ID 透過 Cookie(或 URL 參數)傳給瀏覽器
- 瀏覽器後續每次請求都帶上此 Session ID
- 伺服器根據 Session ID 查找對應的 Session 資料(存在記憶體或檔案中)
- 以此識別使用者的狀態(例如:是否已登入、購物車內容等)
PHP Session 機制
基本使用
PHP 提供內建的 Session 支援,使用非常簡單:
|
|
運作機制
session_start()被呼叫時,PHP 會:- 讀取請求中的 Cookie(預設名稱為
PHPSESSID) - 若無 Cookie,則建立新的 Session ID 並透過
Set-Cookie回應標頭傳給瀏覽器
- 讀取請求中的 Cookie(預設名稱為
- Session 資料預設以檔案形式存在伺服器的
/tmp目錄(可透過session.save_path設定) - 每個 Session 檔案以 Session ID 命名,例如:
sess_abc123xyz
Session 設定
可在 php.ini 或程式中調整 Session 行為:
|
|
Java Servlet Session 機制
基本使用
Java Web 應用透過 HttpSession 介面管理 Session:
|
|
運作機制
- 第一次呼叫
request.getSession()時,Servlet 容器(Tomcat)建立新的HttpSession物件,並生成唯一的 Session ID(JSESSIONID) - Session ID 預設透過 Cookie 傳遞,Cookie 名稱為
JSESSIONID - 若瀏覽器禁用 Cookie,Servlet 支援 URL Rewriting,將 Session ID 附加在 URL 中:
可用
1http://example.com/page;jsessionid=ABC123response.encodeURL(url)自動處理 - 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() |