首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

深入理解 HTTP 會話控制:Cookie 與 Session 機制詳解

     編輯:Java 綜合教學

HTTP 協議的無狀態特性

HTTP 協議本質上是一個無狀態協議,這意味著伺服器無法自行判斷多個請求是否來自同一個瀏覽器,也就無法與瀏覽器建立持續的會話關係。為了解決這一問題,Web 開發引入了會話控制技術,主要包括客戶端的 Cookie 技術和伺服器端的 Session 技術。

Cookie 技術:客戶端的會話追蹤

核心原理

Cookie 是儲存在瀏覽器端的緩存技術。當瀏覽器首次向伺服器發送請求時,伺服器會創建 Cookie 物件,以鍵值對形式放在響應頭中返回。瀏覽器後續發送請求時,會自動在請求頭中攜帶這些 Cookie 資訊,讓伺服器識別客戶端身份。

Cookie 的生命週期管理

  • 建立與返回:使用 new Cookie(key, value) 創建,再透過 response.addCookie(cookie) 送回瀏覽器。
  • 獲取:伺服器端呼叫 request.getCookies() 取得 Cookie 陣列,若無 Cookie 則回傳 null。
  • 時效設定 setMaxAge(seconds):
    • 會話級(預設):seconds 為負數,儲存在瀏覽器記憶體中,關閉瀏覽器即失效。
    • 持久化:seconds 為正數,儲存在本地檔案系統,保存指定秒數。
  • 刪除 Cookie:呼叫 setMaxAge(0) 即可立即刪除。

Session 技術:伺服器端的會話管理

運作機制

Session 是伺服器端的緩存技術,但它依賴 Cookie 運作。核心流程如下:

  1. 首次請求(無 JSESSIONID):伺服器透過 getSession() 創建 Session 物件,並建立名為 JSESSIONID 的 Cookie 返回給瀏覽器。
  2. 後續請求(攜帶 JSESSIONID):伺服器根據 JSESSIONID 查找現有 Session:
    • 找到 → 返回該 Session 物件(以鍵值對形式儲存在伺服器端)。
    • 找不到(含偽造 JSESSIONID)→ 創建新 Session 並返回新的 JSESSIONID Cookie。

Session 常用操作

// 獲取 Session 並設定持久化 Cookie
HttpSession session = request.getSession();
String id = session.getId();
Cookie cookie = new Cookie("JSESSIONID", id);
cookie.setMaxAge(30);
response.addCookie(cookie);

// 設定 Session 空閒失效時間(秒)
session.setMaxInactiveInterval(10);

// 強制 Session 失效
session.invalidate();

URL 重寫:應對禁用 Cookie 的情況

若瀏覽器禁用 Cookie,可使用 URL 重寫將 JSESSIONID 附加在 URL 後:

HttpSession session = request.getSession();
session.setAttribute("attrName", "testValue");
String url = "target url";
url = response.encodeURL(url);
response.sendRedirect(url);

注意:目標頁面若需維持 Session,同樣必須實作 URL 重寫。

關鍵細節補充

  • Session 空閒時間:指 Session 物件未被瀏覽器端存取的時間間隔。
  • request.getSession() 行為:若為客戶端存取的第一個 Web 資源則創建 Session;但若 JSP 頁面指定 session="false",則不會創建。
  • session="false" 的含義:僅禁用當前頁面的 session 隱含變數,仍可使用顯式的 HttpSession 物件。

總結

簡單來說,Cookie 是伺服器與瀏覽器溝通的識別碼。HTTP 無狀態,會話靠 Cookie 維繫(JSESSIONID),Session 建立在 Cookie 之上。理解這層關係,是掌握 Web 會話控制的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved