2013-04-22 34 views
32

Tôi có một yêu cầu máy chủ đó trả về nhiều tập tin cookie, như thế:Làm thế nào để xử lý cookie trong httpUrlConnection sử dụng cookieManager

enter image description here

Đây là cách tôi lưu trữ các cookie này để các cookieManager:

HttpURLConnection connection = ... ; 
static java.net.CookieManager msCookieManager = new java.net.CookieManager(); 
msCookieManager.put(COOKIES_URI, connection.getHeaderFields()); 

Đây là cách tôi thêm các cookie này vào kết nối tiếp theo:

connection.setRequestProperty("Cookie", 
    msCookieManager.getCookieStore().get(COOKIES_URI).toString()); 

Đó có phải là cách đúng đắn để có được các tập tin cookie từ cookieManager ?, Tôi khá chắc chắn có một tốt hơn một ...

Trả lời

82

Ok, đúng cách để làm điều đó chỉ là như thế:

Nhận cookie từ tiêu đề phản ứng và tải chúng vào cookieManager:

static final String COOKIES_HEADER = "Set-Cookie"; 
HttpURLConnection connection = ... ; 
static java.net.CookieManager msCookieManager = new java.net.CookieManager(); 

Map<String, List<String>> headerFields = connection.getHeaderFields(); 
List<String> cookiesHeader = headerFields.get(COOKIES_HEADER); 

if (cookiesHeader != null) { 
    for (String cookie : cookiesHeader) { 
     msCookieManager.getCookieStore().add(null,HttpCookie.parse(cookie).get(0)); 
    }    
} 

Nhận cookie từ cookieManager và tải chúng vào kết nối:

if (msCookieManager.getCookieStore().getCookies().size() > 0) { 
    // While joining the Cookies, use ',' or ';' as needed. Most of the servers are using ';' 
    connection.setRequestProperty("Cookie", 
    TextUtils.join(";", msCookieManager.getCookieStore().getCookies()));  
} 
+0

Khi nào bạn nên đọc cookie? Ngay sau khi mở kết nối? Cảm ơn. – StackPWRequirmentsAreCrazy

+2

+1 Khi sử dụng nhiều cookie, tôi đã có nhiều may mắn hơn khi sử dụng dấu chấm phẩy: 'TextUtils.join ("; ", msCookieManager.getCookieStore(). GetCookies()));' – Reafidy

+2

Woah buddy! Tôi đã cố gắng để làm điều này với một kết nối liên tục http/kết nối httpurlconnection khi THIS là cách chính xác để xử lý phiên đăng nhập của tôi. Cảm ơn bạn vì câu trả lời này! – Jacksonkr

38

Tôi đã tìm kiếm/cố gắng trong nhiều ngày để sửa chữa vấn đề của tôi: không thể truy cập tài nguyên web được bảo vệ ngay cả sau khi đăng nhập thành công

Tôi tạo ra cùng một ứng dụng trên iOS và không có cùng một vấn đề bởi vì NSUrlConnection đã bảo trì cookie cho chúng tôi đằng sau hiện trường. Trên Android, tôi đã thử thêm cookie theo cách thủ công

connection.setRequestProperty("Cookie", "PHPSESSID=str_from_server") 

không may mắn.

Cuối cùng tôi đọc this

và thêm 2 dòng sau ở đâu đó trong đầu ứng dụng của tôi:

CookieManager cookieManager = new CookieManager(); 
CookieHandler.setDefault(cookieManager); 

và tất cả mọi thứ hoạt động tốt ngay bây giờ.

+2

Hoạt động nhờ tuyệt vời, chỉ có những 2 dòng là cần thiết yay^_ ^, đã thử câu trả lời khác quá cả hai công trình nhưng điều này là thuận tiện hơn –

+0

Does nto làm việc cho tôi! Hawwww – User3

+0

Đây phải là câu trả lời được chấp nhận. Tôi đã cố gắng xử lý cookie theo cách thủ công mà không thành công. Hai dòng này chỉ là những gì bạn cần để xử lý cookie với HttpUrlConnection! Cảm ơn vàng Thumb! – Bertrand

0

Câu trả lời được chấp nhận có thể hoạt động nhưng tôi đã tìm thấy giải pháp đơn giản hơn. Giải pháp của Thumb vàng đã không làm việc trong trường hợp của tôi. Xem câu trả lời của tôi connecting webView & httpUrlConnection

2

@ Câu trả lời của David là tốt nhất trong số rất nhiều. Cách dễ nhất để duy trì CookieManager địa phương và tự ghi vào và đọc từ kho lưu trữ cookie được liên kết với trình quản lý cookie này.

Mã này tải cookie từ một phản ứng vào quản lý cookie:

/** 
* Gets Cookies from the response header and loads them into cookie manager 
* 
* @param conn   instance of {@link HttpURLConnection} object 
* @param cookieManager the cookie manager({@link CookieManager} instance) in which the cookies are to be loaded<p>In case a null object is passed, the function will not perform any action and return back to the caller. </p> 
*/ 
public static void loadResponseCookies(@Nullable HttpURLConnection conn,@Nullable CookieManager cookieManager) { 

    //do nothing in case a null cokkie manager object is passed 
    if (cookieManager == null || conn == null){ 
     return; 
    } 

    List<String> cookiesHeader = conn.getHeaderFields().get(COOKIES_HEADER); 
    if (cookiesHeader != null) { 
     for (String cookieHeader : cookiesHeader) { 
      List<HttpCookie> cookies; 
      try { 
       cookies = HttpCookie.parse(cookieHeader); 
      } catch (NullPointerException e) { 
       log.warn(MessageFormat.format("{0} -- Null header for the cookie : {1}",conn.getURL().toString(), cookieHeader.toString())); 
       //ignore the Null cookie header and proceed to the next cookie header 
       continue; 
      } 

      if (cookies != null) { 
       Debug("{0} -- Reading Cookies from the response :", conn.getURL().toString()); 
       for (HttpCookie cookie : cookies) { 
        Debug(cookie.toString()); 
       } 
       if (cookies.size() > 0) { 
        cookieManager.getCookieStore().add(null, HttpCookie.parse(cookieHeader).get(0)); 
       } 
      } 
     } 
    } 
} 

Mã này populates đối tượng HttpUrlConnection với cookie liên quan đến việc quản lý cookie:

public void populateCookieHeaders(HttpURLConnection conn) { 

    if (this.cookieManager != null) { 
     //getting cookies(if any) and manually adding them to the request header 
     List<HttpCookie> cookies = this.cookieManager.getCookieStore().getCookies(); 

     if (cookies != null) { 
      if (cookies.size() > 0) { 
       Debug("{0} -- Adding Cookie Headers : ", url.toString()); 
       for (HttpCookie cookie : cookies) { 
        Debug(cookie.toString(), null); 
       } 

       //adding the cookie header 
       conn.setRequestProperty(COOKIE_REQUEST_HEADER, StringUtils.join(cookies, ";")); 
      } 
     } 
    } 
} 

Đây là nhất thread cách an toàn để xử lý cookie.

Tôi đã thử sử dụng bếp nấu ăn theo chủ đề và một phần mở rộng của CookieManager.Cả hai cách tiếp cận này đều không có tác dụng trong trường hợp của tôi.

0

sử dụng java.net.HttpURLConnection và groovy, chỉ cần thêm URLConnection#addRequestProperty(String key, String value) vào bên trong with đóng.

import java.net.HttpURLConnection 

HttpURLConnection createRequest(String chatRequestBody) { 
    HttpURLConnection httpChatRequest = new URL("${endpoint}").openConnection() as HttpURLConnection 

    httpChatRequest.with { 
     doOutput = true 
     requestMethod = 'POST' 

     //headers 
     addRequestProperty("Content-Type", "application/json") 
     addRequestProperty("Client-Platform", "android") 

     //cookies 
     addRequestProperty("Cookie", "cookie_key1=cookie_value1,cookie_key2=cookie_value2") 

     getOutputStream().write(chatRequestBody.getBytes("UTF-8")) 
    } 
    httpChatRequest 
} 
Các vấn đề liên quan