获取“Set-Cookie”标题

时间:2012-11-09 04:46:45

标签: java cookies apache-httpclient-4.x

我试图设置Cookie'使用apache httpclietn-4.2.2并遇到一些问题。

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

所以我认为问题出在' expires'日期。

我试图做的事情:

1)Invalid cookie header : Unable to parse expires attribute when expires attribute is empty 创建自定义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"));

但我仍然收到警告。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:6)

  • 您正在尝试使用符合RFC 2965的规范解析“Set-Cookie”标头,而RFC 2965仅接受“Set-Cookie2”标头。

  • 有问题的Cookie格式不正确。它包含非标准的'expires'属性,更糟糕的是,它包含一个保留字符(逗号)而不包含引号。但是,鉴于它是一种非常常见的协议违规,HttpClient应该能够使用'best_match','browser_compatibility'或'netscape_draft'策略解析此cookie。

实际上,应该始终使用'best_match'策略,让HttpClient根据cookie头的组成选择最佳匹配策略。

答案 1 :(得分:4)

我知道这是一个老问题。但是我遇到了同样的问题,只想发布我的代码片段来解决它,特别是明确地设置CookieSpecs.STANDARD(详见spec on 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);

希望这有帮助。