【问题标题】:Getting "Set-Cookie" header获取“Set-Cookie”标头
【发布时间】:2012-11-09 04:46:44
【问题描述】:

我正在尝试使用 apache httpclietn-4.2.2 获取“设置 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) 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"));

但我仍然收到该警告。将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:
      • 您正在尝试使用 RFC 2965 兼容规范解析“Set-Cookie”标头,而 RFC 2965 仅接受“Set-Cookie2”标头。

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

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

      【讨论】:

      • 感谢您的回复。我尝试使用所有可用的策略。当我使用最佳匹配、browser_compatibility 或 netscape_draft 时,响应中没有 Set-Cookie 标头,也没有出现警告。
      • @pomkine 如果响应中没有 Set-Cookie 标头,您希望 HttpClient 能够如何解析它?
      • 哦,对不起。我的意思是 response.getAllHeaders() 没有返回 Set-Cookie 标头。
      • @pomkine response#getAllHeaders() 总是返回所有非格式错误的标头,与从线路接收到的完全一样。
      • 因此,如果格式错误,我应该收到警告?嗯,但是当我将策略设置为“best_match”时,我没有收到任何警告,并且除了 Set-Cookie 之外的所有标题。
      猜你喜欢
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 2016-03-05
      • 2021-01-08
      • 2021-10-21
      • 2015-12-29
      • 2019-05-18
      • 2014-02-26
      相关资源
      最近更新 更多