[英]Getting “Set-Cookie” header
我正在尝试使用apache httpclietn-4.2.2获取'Set Cookie'标头并遇到一些问题。
Firebug中的标题:
Set-Cookie remixreg_sid=deleted; expires=Thu, 10-Nov-2011 04:32:30 GMT; path=/;
domain=.vk.com remixapi_sid=deleted; expires=Thu, 10-Nov-2011 04:32:30 GMT; path=/;
domain=.vk.com remixrec_sid=deleted; expires=Thu, 10-Nov-2011 04:32:30 GMT; path=/;
domain=.vk.com remixsid=0000000000000000000000000000000000000000000000000000; expires=Mon, 04-Nov-2013 16:10:24 GMT; path=/; domain=.vk.com
我是如何获得它的:
//location is a header with url I need to do GET request to
Header location = response.getFirstHeader("Location");
HttpGet httpGet = new HttpGet(location.getValue());
httpClient.getParams().setParameter(
//tried to use different policies
ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2965);
Header [] allHeaders=response.getAllHeaders();
在allHeaders中,我有除“Set Cookie”之外的所有标题。 我有这样的警告:
WARNING: Invalid cookie header: "Set-Cookie: remixlang=0; expires=Mon, 18-Nov-2013
03:21:47 GMT; path=/; domain=.vk.com". Unrecognized cookie header 'Set-Cookie:
remixlang=0; expires=Mon, 18-Nov-2013 03:21:47 GMT; path=/; domain=.vk.com'
Nov 09, 2012 4:31:41 AM org.apache.http.client.protocol.ResponseProcessCookies
processCookies
所以我认为问题在于“过期”日期。
我试图做的:
1) 无效的cookie标头:当expires属性为空时无法解析expires属性创建自定义CookieSpec并尝试使用它:
httpClient.getCookieSpecs().register("vkCookie", new CookieSpecFactory() {
public CookieSpec newInstance(HttpParams params){
return new VkCookieSpec();
}
});
HttpClientParams.setCookiePolicy(httpClient.getParams(), "vkCookie");
2)尝试在httpClient参数中设置数据格式:
httpClient.getParams().setParameter(CookieSpecPNames.DATE_PATTERNS, Arrays.asList("EEE, dd-MMM-yyyy HH:mm:ss z"));
但我仍然收到警告。 非常感谢任何帮助。
您正在尝试使用RFC 2965兼容规范解析“Set-Cookie”标头,而RFC 2965仅接受“Set-Cookie2”标头。
有问题的cookie格式不正确。 它包含非标准的'expires'属性,更糟糕的是,它包含一个保留字符(逗号)而不包含引号。 但是,鉴于它是一种非常常见的协议违规,HttpClient应该能够使用'best_match','browser_compatibility'或'netscape_draft'策略解析此cookie。
事实上,应该始终使用'best_match'策略,让HttpClient根据cookie头的组成选择最佳匹配策略。
我知道这是一个老问题。 但我有同样的问题,只是想发布我的代码片段来解决它,特别是明确地设置CookieSpecs.STANDARD
(有关详细信息,请参阅apache commons的规范 ):
RequestConfig globalConfig = RequestConfig.custom()
.setCookieSpec(CookieSpecs.DEFAULT)
.build();
CloseableHttpClient httpClient = HttpClients.custom()
.setDefaultRequestConfig(globalConfig)
.build();
RequestConfig localConfig = RequestConfig.copy(globalConfig)
.setCookieSpec(CookieSpecs.STANDARD)
.build();
HttpGet httpGet = new HttpGet(url);
httpGet.setConfig(localConfig);
// Request
CloseableHttpResponse response = httpClient.execute(httpGet);
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.