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

Java ME 平台實現 Cookie 管理機制

     編輯:Java 相關知識

前言

Java ME (MIDP) 原生不支援 Cookie,導致無法像瀏覽器那樣自動維持會話狀態,開發者常被迫使用 URL 重寫。本文詳述在 MIDP 上手工實現完整 Cookie 機制的三大步驟:獲取、存儲、發送。

Cookie 工作原理回顧

  1. Server 回應含 Set-Cookie: name=value; Path=/; Domain=.example.com; Expires=...。
  2. Client 解析並按 Domain+Path 存儲。
  3. 後續請求自動附加 Cookie: name=value(符合 Domain/Path/未過期)。

1. 獲取 Cookie(解析回應頭)

private static final String SET_COOKIE = "Set-Cookie";
private static final String COOKIE = "Cookie";

public void extractCookies(HttpConnection conn, String url) {
    int i = 0;
    String key;
    while ((key = conn.getHeaderFieldKey(i)) != null) {
        if (SET_COOKIE.equalsIgnoreCase(key)) {
            String cookieVal = conn.getHeaderField(i);
            saveCookie(cookieVal, url);
        }
        i++;
    }
}

需遍歷所有同名頭欄位(一個回應可下發多個 Cookie)。

2. 存儲 Cookie(RMS + 內存雙層)

Cookie 領域模型

public class Cookie implements Serializable {
    private String name, value, path, domain;
    private long expires; // 0 = session cookie
    // getter/setter、equals/hashCode(按 name+path+domain)、isExpired()
    // 序列化:DataOutputStream writeUTF/writeLong
    // 反序列化:DataInputStream readUTF/readLong
    // 靜態解析方法 parseCookie(String header, String requestUri)
}

存儲策略

  • 持久 Cookie(有 Expires):序列化存入 RMS (RecordStore),跨 MIDlet 啟動保留。
  • 會話 Cookie(無 Expires):僅存 Hashtable 內存,MIDlet 退出自動失效。

3. 發送 Cookie(請求前掛載)


public void attachCookies(HttpConnection conn, String url) {
    String cookieHeader = collectMatchingCookies(url);
    if (cookieHeader != null) {
        conn.setRequestProperty(COOKIE, cookieHeader);
    }
}

private String collectMatchingCookies(String url) {
    // 1. 從 RMS 讀取所有持久 Cookie
    // 2. 合併內存會話 Cookie
    // 3. 過濾:domainMatch(url) && pathMatch(url) && !isExpired()
    // 4. 拼接 "name1=value1; name2=value2"
}

域/路徑匹配規則

  • Domain:Cookie domain .example.com 匹配 api.example.com、example.com;不匹配 other.com。
  • Path:Cookie path /app 匹配 /app/servlet、/app/index.html;不匹配 /other。
  • 預設 Path = 請求 URI 目錄;預設 Domain = 請求主機名。

整合建議

將上述邏輯封裝為 HttpConnectionWrapper 或攔截器,業務代碼無感知:

HttpConnection conn = (HttpConnection) Connector.open(url);
CookieManager.attachCookies(conn, url);
// 發送請求、讀取回應
CookieManager.extractCookies(conn, url);

參考實現

《Java ME 核心技術與最佳實踐》書中 httpme 框架包含生產級 Cookie 實現,可直接引用。

總結

在 Java ME 上實現 Cookie 需:解析 Set-Cookie 頭 → 領域模型 + RMS/內存雙層存儲 → 請求前按域路徑過濾拼裝 Cookie 頭。封裝良好後,網絡層即可透明支援會話保持,大幅簡化業務開發。

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