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无状态问题的会话令牌(名称/值对+属性)
规范选择 新项目必用STANDARDSTANDARD_STRICT(RFC 6265)
作用域控制 domainpath属性限定Cookie生效范围
持久化存储 CookieStore接口实现Cookie保存(默认BasicCookieStore为内存存储)
优先级规则 请求级配置 > 上下文配置 > 全局配置
上下文对象 存储运行时状态:Cookie规范/存储/来源信息

通俗解释:

场景类比:咖啡店会员系统

  1. Cookie = 会员卡

    • 卡号:name="user", value="zhangsan"
    • 分店限制:domain=".coffeechain.com"(仅连锁店通用)
    • 区域限制:path="/vip-room"(仅VIP区可用)
  2. Cookie规范 = 验卡规则

    • 严格模式(STANDARD_STRICT):
      ✓ 必须出示实体卡 ✗ 不接受手写卡号
    • 宽松模式(STANDARD):
      ✓ 接受电子卡截图(兼容旧系统)
  3. Cookie存储 = 卡包

    BasicCookieStore wallet = new BasicCookieStore();  // 钱包
    wallet.addCard("金卡"); // 存卡
    

    注:默认钱包关店清空(内存存储),需定制实现持久化

  4. 上下文配置 = 临时规则

    • 今日分店庆:所有顾客自动升级银卡(请求级覆盖全局规则)
    • 经理巡查时:启用严格验卡(上下文切换策略)
  5. 执行过程

    sequenceDiagram
       客户端->>服务器: 首次请求(无卡)
       服务器->>客户端: 发卡(Set-Cookie)
       客户端->>卡包: 存卡
       客户端->>服务器: 后续请求(自动带Cookie)
    

关键结论

  • Cookie是HTTP的"记忆芯片",通过简单令牌实现会话跟踪
  • 规范选择决定安全性与兼容性平衡
  • 上下文管理提供灵活的运行时控制能力
posted @ 2025-07-24 10:39  hqq的进阶日记  阅读(26)  评论(0)    收藏  举报