2012-11-09 57 views
7

我試圖使用apache httpclietn-4.2.2獲得'Set Cookie'標頭並出現一些問題。獲取「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我都頭,除了 「設置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)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 PARAMS:

httpClient.getParams().setParameter(CookieSpecPNames.DATE_PATTERNS, Arrays.asList("EEE, dd-MMM-yyyy HH:mm:ss z")); 

但我仍然得到這個警告。將不勝感激任何幫助。

回答

5
  • 您試圖解析「設置Cookie」的文件頭和RFC 2965符合技術規範,而RFC 2965只接受「設置COOKIE2」頭。

  • 有問題的cookie格式不正確。它包含非標準的'expires'屬性,更糟糕的是,它包含一個不帶引號的保留字符(逗號)。然而,鑑於這是一個非常普遍的協議違規,HttpClient應該能夠使用'best_match','browser_compatibility'或'netscape_draft'策略來解析這個cookie。

其實,每個人都應該可以使用「best_match」政策,讓HttpClient的回暖基於cookie的頭組成的最佳匹配政策。

+0

感謝您的回覆。我試圖使用所有可用的策略。當我使用最佳匹配,browser_compatibility或netscape_draft時,響應中沒有Set-Cookie標題,並且沒有警告出現。 – pomkine

+0

@pomkine如果響應中沒有Set-Cookie標頭,您如何期望HttpClient能夠解析它? – oleg

+0

哦,對不起。我的意思是沒有由response.getAllHeaders()返回的Set-Cookie頭文件。 – pomkine

3

我知道這是一個老問題。但我有同樣的問題,只是想後我的片段來解決這個問題,特別是設置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); 

希望這有助於。