Apache HttpClient 4.5.x 學(xué)習(xí)總結(jié)十:HTTP狀態(tài)管理
精簡(jiǎn)翻譯:
3.1 HTTP Cookies
Cookie是HTTP代理與服務(wù)器交換的會(huì)話狀態(tài)令牌,核心組成:
- 名稱/值對(duì)(必需)
- 作用域名(domain)
- 路徑范圍(path)
- 有效期(max-age)
// 創(chuàng)建客戶端Cookie
BasicClientCookie cookie = new BasicClientCookie("user", "zhangsan");
cookie.setDomain(".example.com"); // 作用域名
cookie.setPath("/"); // 作用路徑
3.2 Cookie規(guī)范
CookieSpec定義Cookie處理規(guī)則,推薦規(guī)范:
| 規(guī)范類型 | 說明 | 適用場(chǎng)景 |
|---|---|---|
STANDARD_STRICT |
嚴(yán)格遵循RFC 6265 | 高安全性場(chǎng)景 |
STANDARD |
寬松版RFC 6265(兼容舊服務(wù)器) | 通用場(chǎng)景(推薦) |
IGNORE_COOKIES |
忽略所有Cookie | 無狀態(tài)請(qǐng)求 |
| 注:Netscape/RFC 2109等舊規(guī)范已廢棄 |
3.3 策略設(shè)置
支持全局和請(qǐng)求級(jí)配置:
// 全局策略
RequestConfig globalConfig = RequestConfig.custom()
.setCookieSpec(CookieSpecs.STANDARD) // 全局用STANDARD
.build();
// 單個(gè)請(qǐng)求用嚴(yán)格策略
RequestConfig localConfig = RequestConfig.copy(globalConfig)
.setCookieSpec(CookieSpecs.STANDARD_STRICT)
.build();
httpGet.setConfig(localConfig);
3.4 自定義策略
實(shí)現(xiàn)CookieSpec接口并注冊(cè):
Registry<CookieSpecProvider> reg = RegistryBuilder.create()
.register("myPolicy", new MyCookieSpecProvider()) // 自定義策略
.build();
RequestConfig config = RequestConfig.custom()
.setCookieSpec("myPolicy") // 啟用自定義策略
.build();
3.5 Cookie持久化
通過CookieStore接口實(shí)現(xiàn):
CookieStore cookieStore = new BasicCookieStore(); // 內(nèi)存存儲(chǔ)
cookieStore.addCookie(cookie); // 添加Cookie
// 綁定到HTTP客戶端
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCookieStore(cookieStore)
.build();
3.6 狀態(tài)管理與執(zhí)行上下文
HttpClient將狀態(tài)對(duì)象存入執(zhí)行上下文(HttpContext):
CookieSpec:當(dāng)前使用的Cookie規(guī)范CookieStore:當(dāng)前Cookie存儲(chǔ)CookieOrigin:服務(wù)器來源信息
// 獲取上下文狀態(tài)
CookieOrigin origin = context.getCookieOrigin();
CookieSpec spec = context.getCookieSpec();
核心知識(shí)點(diǎn)提煉:
| 主題 | 要點(diǎn) |
|---|---|
| Cookie本質(zhì) | 解決HTTP無狀態(tài)問題的會(huì)話令牌(名稱/值對(duì)+屬性) |
| 規(guī)范選擇 | 新項(xiàng)目必用STANDARD或STANDARD_STRICT(RFC 6265) |
| 作用域控制 | domain和path屬性限定Cookie生效范圍 |
| 持久化存儲(chǔ) | CookieStore接口實(shí)現(xiàn)Cookie保存(默認(rèn)BasicCookieStore為內(nèi)存存儲(chǔ)) |
| 優(yōu)先級(jí)規(guī)則 | 請(qǐng)求級(jí)配置 > 上下文配置 > 全局配置 |
| 上下文對(duì)象 | 存儲(chǔ)運(yùn)行時(shí)狀態(tài):Cookie規(guī)范/存儲(chǔ)/來源信息 |
通俗解釋:
場(chǎng)景類比:咖啡店會(huì)員系統(tǒng) ?
-
Cookie = 會(huì)員卡
- 卡號(hào):
name="user", value="zhangsan" - 分店限制:
domain=".coffeechain.com"(僅連鎖店通用) - 區(qū)域限制:
path="/vip-room"(僅VIP區(qū)可用)
- 卡號(hào):
-
Cookie規(guī)范 = 驗(yàn)卡規(guī)則
- 嚴(yán)格模式(STANDARD_STRICT):
? 必須出示實(shí)體卡 ? 不接受手寫卡號(hào) - 寬松模式(STANDARD):
? 接受電子卡截圖(兼容舊系統(tǒng))
- 嚴(yán)格模式(STANDARD_STRICT):
-
Cookie存儲(chǔ) = 卡包
BasicCookieStore wallet = new BasicCookieStore(); // 錢包 wallet.addCard("金卡"); // 存卡注:默認(rèn)錢包關(guān)店清空(內(nèi)存存儲(chǔ)),需定制實(shí)現(xiàn)持久化
-
上下文配置 = 臨時(shí)規(guī)則
- 今日分店慶:所有顧客自動(dòng)升級(jí)銀卡(請(qǐng)求級(jí)覆蓋全局規(guī)則)
- 經(jīng)理巡查時(shí):?jiǎn)⒂脟?yán)格驗(yàn)卡(上下文切換策略)
-
執(zhí)行過程
sequenceDiagram 客戶端->>服務(wù)器: 首次請(qǐng)求(無卡) 服務(wù)器->>客戶端: 發(fā)卡(Set-Cookie) 客戶端->>卡包: 存卡 客戶端->>服務(wù)器: 后續(xù)請(qǐng)求(自動(dòng)帶Cookie)
關(guān)鍵結(jié)論:
- Cookie是HTTP的"記憶芯片",通過簡(jiǎn)單令牌實(shí)現(xiàn)會(huì)話跟蹤
- 規(guī)范選擇決定安全性與兼容性平衡
- 上下文管理提供靈活的運(yùn)行時(shí)控制能力
浙公網(wǎng)安備 33010602011771號(hào)