Apache HttpClient 4.5.x 学习总结十:HTTP状态管理
精简翻译:
3.1 HTTP Cookies
Cookie是HTTP代理与服务器交换的会话状态令牌,核心组成:
- 名称/值对(必需)
- 作用域名(domain)
- 路径范围(path)
- 有效期(max-age)
// 创建客户端Cookie
BasicClientCookie cookie = new BasicClientCookie("user", "zhangsan");
cookie.setDomain(".example.com"); // 作用域名
cookie.setPath("/"); // 作用路径
3.2 Cookie规范
CookieSpec定义Cookie处理规则,推荐规范:
| 规范类型 | 说明 | 适用场景 |
|---|---|---|
STANDARD_STRICT |
严格遵循RFC 6265 | 高安全性场景 |
STANDARD |
宽松版RFC 6265(兼容旧服务器) | 通用场景(推荐) |
IGNORE_COOKIES |
忽略所有Cookie | 无状态请求 |
| 注:Netscape/RFC 2109等旧规范已废弃 |
3.3 策略设置
支持全局和请求级配置:
// 全局策略
RequestConfig globalConfig = RequestConfig.custom()
.setCookieSpec(CookieSpecs.STANDARD) // 全局用STANDARD
.build();
// 单个请求用严格策略
RequestConfig localConfig = RequestConfig.copy(globalConfig)
.setCookieSpec(CookieSpecs.STANDARD_STRICT)
.build();
httpGet.setConfig(localConfig);
3.4 自定义策略
实现CookieSpec接口并注册:
Registry<CookieSpecProvider> reg = RegistryBuilder.create()
.register("myPolicy", new MyCookieSpecProvider()) // 自定义策略
.build();
RequestConfig config = RequestConfig.custom()
.setCookieSpec("myPolicy") // 启用自定义策略
.build();
3.5 Cookie持久化
通过CookieStore接口实现:
CookieStore cookieStore = new BasicCookieStore(); // 内存存储
cookieStore.addCookie(cookie); // 添加Cookie
// 绑定到HTTP客户端
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCookieStore(cookieStore)
.build();
3.6 状态管理与执行上下文
HttpClient将状态对象存入执行上下文(HttpContext):
CookieSpec:当前使用的Cookie规范CookieStore:当前Cookie存储CookieOrigin:服务器来源信息
// 获取上下文状态
CookieOrigin origin = context.getCookieOrigin();
CookieSpec spec = context.getCookieSpec();
核心知识点提炼:
| 主题 | 要点 |
|---|---|
| Cookie本质 | 解决HTTP无状态问题的会话令牌(名称/值对+属性) |
| 规范选择 | 新项目必用STANDARD或STANDARD_STRICT(RFC 6265) |
| 作用域控制 | domain和path属性限定Cookie生效范围 |
| 持久化存储 | CookieStore接口实现Cookie保存(默认BasicCookieStore为内存存储) |
| 优先级规则 | 请求级配置 > 上下文配置 > 全局配置 |
| 上下文对象 | 存储运行时状态:Cookie规范/存储/来源信息 |
通俗解释:
场景类比:咖啡店会员系统 ☕
-
Cookie = 会员卡
- 卡号:
name="user", value="zhangsan" - 分店限制:
domain=".coffeechain.com"(仅连锁店通用) - 区域限制:
path="/vip-room"(仅VIP区可用)
- 卡号:
-
Cookie规范 = 验卡规则
- 严格模式(STANDARD_STRICT):
✓ 必须出示实体卡 ✗ 不接受手写卡号 - 宽松模式(STANDARD):
✓ 接受电子卡截图(兼容旧系统)
- 严格模式(STANDARD_STRICT):
-
Cookie存储 = 卡包
BasicCookieStore wallet = new BasicCookieStore(); // 钱包 wallet.addCard("金卡"); // 存卡注:默认钱包关店清空(内存存储),需定制实现持久化
-
上下文配置 = 临时规则
- 今日分店庆:所有顾客自动升级银卡(请求级覆盖全局规则)
- 经理巡查时:启用严格验卡(上下文切换策略)
-
执行过程
sequenceDiagram 客户端->>服务器: 首次请求(无卡) 服务器->>客户端: 发卡(Set-Cookie) 客户端->>卡包: 存卡 客户端->>服务器: 后续请求(自动带Cookie)
关键结论:
- Cookie是HTTP的"记忆芯片",通过简单令牌实现会话跟踪
- 规范选择决定安全性与兼容性平衡
- 上下文管理提供灵活的运行时控制能力
浙公网安备 33010602011771号