2012-11-09 38 views
7

Tôi đang cố gắng lấy tiêu đề 'Đặt Cookie' bằng apache httpclietn-4.2.2 và gặp một số vấn đề.Tiêu đề "Đặt cookie"

Header trong 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 

Làm thế nào tôi đang cố gắng để có được nó:

//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(); 

Trong allHeaders tôi có tất cả các tiêu trừ "Đặt Cookie". Và tôi có các cảnh báo như sau:

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 

Vì vậy, tôi nghĩ vấn đề là ngày 'hết hạn'.

Những gì tôi đã cố gắng để làm:

1) Invalid cookie header : Unable to parse expires attribute when expires attribute is empty Tạo tùy chỉnh CookieSpec và cố gắng sử dụng nó:

httpClient.getCookieSpecs().register("vkCookie", new CookieSpecFactory() { 
    public CookieSpec newInstance(HttpParams params){ 
     return new VkCookieSpec(); 
     } 
    }); 
HttpClientParams.setCookiePolicy(httpClient.getParams(), "vkCookie"); 

2) Cố gắng để thiết lập định dạng dữ liệu trong HttpClient params:

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

Nhưng tôi vẫn nhận được cảnh báo đó. Sẽ đánh giá cao sự giúp đỡ nào.

Trả lời

5
  • Bạn đang cố gắng phân tích tiêu đề 'Đặt cookie' bằng thông số tuân thủ RFC 2965, trong khi RFC 2965 chỉ chấp nhận tiêu đề 'Set-Cookie2'.

  • Cookie được đề cập không đúng định dạng. Nó chứa thuộc tính 'hết hạn' không chuẩn, trong đó, để làm cho vấn đề tồi tệ hơn, chứa ký tự dành riêng (dấu phẩy) mà không kèm theo dấu ngoặc kép. Tuy nhiên, vì nó là một giao thức vi phạm rất phổ biến, HttpClient nên có khả năng phân tích cú pháp cookie này bằng chính sách 'best_match', 'browser_compatibility' hoặc 'netscape_draft'.

Thực tế, người ta phải sử dụng chính sách 'best_match' và để HttpClient chọn chính sách đối sánh tốt nhất dựa trên thành phần của tiêu đề cookie.

+0

Cảm ơn bạn đã trả lời. Tôi đã cố gắng sử dụng tất cả các chính sách có sẵn. Khi tôi sử dụng kết hợp tốt nhất, browser_compatibility hoặc netscape_draft, không có tiêu đề Set-Cookie trong phản hồi và không có cảnh báo nào xuất hiện. – pomkine

+0

@pomkine nếu không có tiêu đề Set-Cookie trong phản hồi, làm thế nào để bạn mong đợi HttpClient để có thể phân tích nó? – oleg

+0

ohhh, xin lỗi. Tôi có nghĩa là không có tiêu đề Set-Cookie trả về bởi response.getAllHeaders(). – pomkine

3

Tôi biết đây là câu hỏi cũ. Nhưng tôi đã có cùng một vấn đề và chỉ muốn gửi đoạn của tôi để giải quyết nó, trong bối cảnh đặc biệt CookieSpecs.STANDARD một cách rõ ràng (xem spec on apache commons để biết chi tiết):

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

Hope this helps.

Các vấn đề liên quan