7

apache httpclietn-4.2.2を使用して「SetCookie」ヘッダーを取得しようとしていますが、いくつか問題があります。

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には、「SetCookie」を除くすべてのヘッダーがあります。そして、私はこのような警告があります:

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

しかし、私はまだその警告を受けています。助けていただければ幸いです。

4

2 に答える 2

7

私はこれが古い質問であることを知っています。しかし、私は同じ問題を抱えていて、それを解決するためにスニペットを投稿したかっただけで、特に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);

お役に立てれば。

于 2016-09-14T08:15:11.020 に答える
6
  • RFC 2965 準拠の仕様で「Set-Cookie」ヘッダーを解析しようとしていますが、RFC 2965 は「Set-Cookie2」ヘッダーのみを受け入れます。

  • 問題の Cookie の形式が正しくありません。これには非標準の 'expires' 属性が含まれており、さらに悪いことに、引用符で囲まれていない予約文字 (コンマ) が含まれています。ただし、これは非常に一般的なプロトコル違反であるため、HttpClient は「best_match」、「browser_compatibility」、または「netscape_draft」ポリシーを使用してこの Cookie を解析できるはずです。

実際、常に「best_match」ポリシーを使用し、Cookie ヘッダーの構成に基づいて HttpClient に最適な一致ポリシーを選択させる必要があります。

于 2012-11-09T09:59:14.927 に答える