首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle HTTP Servlet 狀態持久化:Cookie、Session、URL 重寫機制與 Servlet 代碼實戰

     編輯:Oracle 資料庫相關知識

HTTP 協議無狀態,Web 應用需通過 Cookie、Session、URL 重寫 實現會話狀態持久化。本文系統講解三大機制原理、Servlet API 使用、代碼實例、安全考量與選型指南,針對 Oracle Web 開發者(OC4J/WebLogic/GlassFish 通用)。

一、HTTP 無狀態本質與持久化需求

  • 無狀態:每次請求獨立,服務端不記住客戶端身份。
  • 優點:簡單、可擴展、故障恢復快(無會話親和性要求)。
  • 缺點:事務處理需反覆傳遞上下文、難以實現個性化體驗。
  • 持久化目標:減少數據傳輸、身份認證、授權控制、購物車/向導式流程。

二、Cookie:客戶端持久化

1. 核心規範

  • Netscape v0:Set-Cookie: NAME=VALUE; Expires=DATE; Path=PATH; Domain=DOMAIN; Secure
  • RFC 2109 (v1):Set-Cookie: NAME=VALUE; Comment=...; Domain=...; Max-Age=SECONDS; Path=...; Secure; Version=1
  • RFC 6265:現代瀏覽器實際遵循標準,HttpOnly、SameSite 屬性增強安全。

2. Servlet Cookie API

// 創建
Cookie c = new Cookie("userId", "12345");
c.setMaxAge(3600);          // 秒,負數=會話級,0=刪除
c.setPath("/app");          // 作用路徑
c.setDomain(".company.com");// 跨子域
c.setSecure(true);          // 僅 HTTPS
c.setHttpOnly(true);        // 防 XSS 竊取
c.setComment("User session");

// 寫入響應
response.addCookie(c);

// 讀取請求
Cookie[] cookies = request.getCookies();
if (cookies != null) {
  for (Cookie ck : cookies) {
    if ("userId".equals(ck.getName())) { ... }
  }
}

3. 登錄案例:Cookie 記住用戶

// LoginServlet.doPost
String u = request.getParameter("username");
String p = request.getParameter("password");
if (auth(u,p)) {
  Cookie c = new Cookie("loginToken", generateToken(u));
  c.setMaxAge(7*24*3600);  // 7 天
  c.setPath("/");
  response.addCookie(c);
  response.sendRedirect("welcome.jsp");
}

// WelcomeServlet.doGet
Cookie[] cs = request.getCookies();
String token = Arrays.stream(cs).filter(c->"loginToken".equals(c.getName())).findFirst().map(Cookie::getValue).orElse(null);
if (token != null && validateToken(token)) {
  out.println("Welcome back, " + getUserFromToken(token));
} else {
  response.sendRedirect("login.jsp");
}

4. Cookie 缺點

  • 用戶可禁用/清除 Cookie。
  • 大小限制 4KB,數量限制每域 ~50-300。
  • 敏感信息不宜直存(需加密/簽名)。
  • CSRF 風險(需 SameSite=Strict/Lax + 雙重提交 Cookie)。

三、Session:服務端持久化

1. 原理

  • 容器為每個瀏覽器會話創建 HttpSession 對象,內存/數據庫/Redis 存儲屬性映射。
  • Session ID 通過 JSESSIONID Cookie 或 URL 重寫在客戶端與服務端傳遞。
  • 超時失效(默認 30 分鐘,可配 web.xml <session-timeout> 或 session.setMaxInactiveInterval())。

2. Servlet Session API

HttpSession session = request.getSession(true);  // 獲取或創建
session.setAttribute("user", userObj);           // 存放對象
User u = (User) session.getAttribute("user");    // 取出
session.removeAttribute("cart");                 // 移除
session.invalidate();                            // 強制銷毀(登出)

3. Session vs Cookie 對比

四、URL 重寫:無 Cookie 環境備選

  • 原理:將 jsessionid 附加到所有 URL:/app/page;jsessionid=ABC123。
  • API:response.encodeURL("/page.jsp")、response.encodeRedirectURL("/login.jsp")。
  • 缺點:URL 醜陋、書籤失效、SSL 重協商、SEO 不友好、需對所有輸出鏈接處理。
  • 適用:禁用 Cookie 的舊設備/爬蟲/嵌入式瀏覽器。

五、最佳實踐與安全加固

  1. 優先 Session + 安全 Cookie:敏感狀態放 Session,僅 Session ID 走 Cookie(HttpOnly + Secure + SameSite=Strict)。
  2. 防 Session Fixation:登錄成功後 session.invalidate() → request.getSession(true) 換新 ID。
  3. 集群 Session 共享:
    • WebLogic:PersistentStoreType=replicated_if_clustered 或 JDBC/Coherence/Redis 存儲。
    • Tomcat/Jetty:RedisSessionManager / JDBCStore。
    • Spring Session:統一抽象,一鍵接入 Redis/MongoDB/Hazelcast。
  4. 超時配置:web.xml <session-config><session-timeout>15</session-timeout></session-config>(分鐘)。
  5. 審計日志:記錄 Session 創建/銷毀/關鍵屬性變更,支撐安全審計。

六、Oracle Web 容器特有提示

  • OC4J (10g AS):orion-web.xml 配置 <session-tracking-mode>COOKIE</session-tracking-mode>。
  • WebLogic (12c/14c):控制台 → Deployments → WebApp → Session → 設置 Timeout、Cookie 名、URL 重寫開關。
  • GlassFish/Payara:glassfish-web.xml <session-config><cookie-properties><property name="httpOnly" value="true"></property></cookie-properties></session-config>。

掌握「Session 存狀態、Cookie 傳 ID、URL 重寫作備胎」三層架構,配合集群外部化存儲與安全屬性加固,即可構建健壯、可擴展、合規的 Web 會話管理體系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
維度CookieSession
存儲位置客戶端(瀏覽器內存/硬盤)服務端(內存/DB/Redis)
容量4KB/條受限於服務端內存/存儲
安全性可被竊取/篡改相對安全(ID 難猜測)
生命週期可持久化(Max-Age)會話級/配置超時
跨瀏覽器共享同域名下共享不同瀏覽器 = 不同 Session
集群擴展天然無狀態需 Session Replication / Sticky Session / 外部存儲