获取“Set-Cookie”标头

8

我正在尝试使用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

我认为问题出现在 'expires' 日期上。

我尝试过:

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"));

但我仍然收到该警告。 非常感谢任何帮助。
2个回答

8

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

希望这可以帮助到你。

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

  • 问题中的cookie格式不正确。它包含非标准的“expires”属性,更糟糕的是,该属性包含一个保留字符(逗号),但没有括号引用。然而,由于这是一个非常普遍的协议违规行为,HttpClient应该能够使用“best_match”、“browser_compatibility”或“netscape_draft”策略解析此cookie。

事实上,应始终使用“best_match”策略,并让HttpClient根据cookie头的组成选择最佳匹配策略。


如果响应中没有Set-Cookie头,你怎么期望HttpClient能够解析它呢? - ok2c
@pomkine response#getAllHeaders() 总是返回所有非畸形的头部,就像从线路接收到的一样。 - ok2c
那么如果它格式不正确,我应该会收到警告吗?嗯,但是当我将策略设置为“best_match”时,我没有收到任何警告,并且已经获取了除Set-Cookie之外的所有标头。 - pomkine
有什么想法可能是问题的原因吗? :) - pomkine
请@pomkine提供完整的会话线路/上下文日志。请参阅http://hc.apache.org/httpcomponents-client-ga/logging.html。 - ok2c
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接