HttpClient Cookies
简介
HttpClient 支持自动管理 Cookies ,允许服务端设定 Cookies ,并在请求时自动返回客户端的 Cookies 信息。客户端也可以手动的设置 Cookies 发送到服务端。
不幸的是,同一时间内有太多的 Cookies 标准: Netscape Cookie , RFC2109, RFC2965 以及 大量供应商不符合规范的自定义 Cookies 标准。针对此, HttpClient 提供 Cookies 管理策略驱动。这片文章意在阐述怎么样去使用不同标准的 Cookies 以及如何解决在使用 Cookies 和 HttpClient 时一些共同的问题。
支持的规格
以下 Cookies 标准, HttpClient3.1 可以支持。
RFC2109
RFC2109 是 W3C 组织第一次推出的官方 Cookies 标准。理论上,所有使用版本 1Cookies 的服务端都应该使用此标准。 HttpClient 已经将此标准设定为默认。
遗憾的是,许多服务端不正确的实现了标准或者仍然使用 Netscape 标准。所有有时感到此标准太多于严格。
RFC2109 是 HttpClient 使用的默认 Cookies 协议。
RFC2965
RFC2965 定义了版本 2 并且尝试去弥补在版本 1 中 Cookie 的 RFC2109 标准的缺点。 RFC2965 是,并规定 RFC2965 最终取代 RFC2109.
发送 RFC2965 标准 Cookies 的服务端,将会使用 Set-Cookie2 header 添加到 Set-Cookie Header 信心中, RFC2965 Cookies 是区分端口的。
Netscape 标准
Netscape 是最原始的 Cookies 规范,同时也是 RFC2109 的基础。尽管如此,还是在很多重要的方 面与 RFC2109 不同,可能需要特定服务器才可以兼容。
Browser Compatibility
这种兼容性设计要求是适应尽可能多的不同的服务器,尽管不是完全按 照标准来实现的。如果你遇到了解析 Cookies 的问题,你就可能要用到这一个规范。
有太多的 web 站 点是用 CGI 脚本去实现的,而导致只有将所有的 Cookies 都放入 Request header 才可以正常的工作。这种情况下最好设 置 http.protocol.single-cookie -header 参数为 true 。
Ignore Cookies
此规格忽略 所有 Cookie 。被用来防止 HttpClient 接受和发送的 Cookie 。
Spacifying the Specification
有俩中方式 去规定使用哪种 Cookies 规范,每个 HttpMethod 实例都有 HttpMethodParams ,他的 policy 值必须使用方法 CookiePolicy.registerCookieSpec() 来注册。
HttpMethod method = new GetMethod();
Method.getParams().setCookiePolicy(CookiePolicy.RFC_2109);
手动处理 Cookies
HttpClient 的 Cookie 管理 API 可以手动处理 Cookie 。可以手动设置 Requset 的 Cookie headers 或是处理 Response 的 Set-Cookie 的 headers 或是用自动 Cookie 管理去代替。
HttpMethod method = new GetMethod();
Method.getParams().setCookiePolicy(CookiePolicy.IGNORE_COOKIES);
Method.setRequestHeader(“Cookie ”, “special_cookie=value”);