2012-05-23 44 views
12

Chúng tôi có một ứng dụng Android yêu cầu người dùng nhập câu trả lời vào hình ảnh xác thực. Captcha được tạo trên máy chủ của chúng tôi. Khi trả lời, nó được gửi đến máy chủ để xác minh.Sử dụng lại HttpURLConnection để giữ phiên còn sống

Vấn đề là vì tôi phải đóng HttpURLConnection sau khi yêu cầu Captcha, tôi thấy rằng câu trả lời đang chạy trên một phiên khác trên máy chủ. Bởi vì điều này Captcha kiểm tra thất bại vì nó phụ thuộc phiên.

Có cách nào để giữ kết nối luôn hoạt động hoặc tôi có nên theo một con đường khác không? Tôi biết rằng trong ứng dụng iPhone tương đương, chúng vẫn được "kết nối" và do đó có cùng sessionid.

Edit:

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

    URL urlObj = new URL(urlPath); 
    conn = (HttpURLConnection) urlObj.openConnection(); 

    if (urlPath.toLowerCase().startsWith("https:")) { 
     initializeHttpsConnection((HttpsURLConnection) conn); 
    } 
    conn.setRequestMethod("POST"); 
    conn.setRequestProperty("Content-Language", "en-US"); 
    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
    conn.setRequestProperty("Content-Length", Integer.toString(bodyData.length)); 
    if (_sessionIdCookie != null) { 
     conn.setRequestProperty("Cookie", _sessionIdCookie); 
    } 
    // Connect 
    conn.setDoInput(true); 
    conn.setDoOutput(true); 
    conn.connect(); 

Trả lời

13

Thông thường, các buổi không được giữ dựa trên kết nối http riêng của mình. Điều đó sẽ không có ý nghĩa gì cả. Các phiên thường được duy trì thông qua một cookie ở phía máy khách và thông tin phiên ở phía máy chủ. Những gì bạn phải làm là lưu (các) cookie bạn đang nhận và sau đó thiết lập (các) cookie đó vào lần tiếp theo bạn kết nối với máy chủ.

Để tìm hiểu thêm về cách làm việc với các phiên và cookie với lớp HttpUrlConnection, đọc tài liệu: http://developer.android.com/reference/java/net/HttpURLConnection.html

Dưới đây là một trích đoạn nhỏ để giúp bạn bắt đầu:

Để thiết lập và duy trì một khả năng phiên lâu dài giữa khách hàng và máy chủ, HttpURLConnection bao gồm cookie có thể mở rộng người quản lý. Kích hoạt tính năng quản lý cookie VM toàn sử dụng CookieHandler và CookieManager:

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

EDIT:

Đối với những người làm việc với các cấp API 8 hoặc thấp hơn, bạn sẽ cần phải sử dụng thư viện Apache!

Dưới đây là một số mã tham khảo:

// Create a local instance of cookie store 
    CookieStore cookieStore = new BasicCookieStore(); 

    // Create local HTTP context 
    HttpContext localContext = new BasicHttpContext(); 
    // Bind custom cookie store to the local context 
    localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 

    HttpGet httpget = new HttpGet("http://www.google.com/"); 

    System.out.println("executing request " + httpget.getURI()); 

    // Pass local context as a parameter 
    HttpResponse response = httpclient.execute(httpget, localContext); 

Đoạn mã trên được lấy từ ví dụ thư viện của Apache. Nó có thể được tìm thấy ở đây: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientCustomContext.java

EDIT 2: Làm cho nó rõ ràng:

Đối với thư viện Apache bạn cần phải bằng cách nào đó "kết nối" các đối tượng quản lý cookie với các đối tượng kết nối và bạn làm điều đó thông qua đối tượng HttpContext.

Trong trường hợp của HttpUrlConnection không cần thiết. khi bạn sử dụng phương pháp tĩnh của CookieHandler setDefault, bạn đang đặt cookieHandler trên toàn hệ thống. Dưới đây là một đoạn trích từ CookieHandler.java.Lưu ý tên biến (từ Open Source của Project (AOSP) kho Android):

37 /** 
38  * Sets the system-wide cookie handler. 
39  */ 
40  public static void setDefault(CookieHandler cHandler) { 
41   systemWideCookieHandler = cHandler; 
42  } 
+0

Sau khi tôi đã xác định "CookieManager" thì tôi có thêm một ứng dụng giữ sessionid không? – theblitz

+0

Ok, tôi có một câu hỏi quan trọng đối với bạn: Bạn có đang sử dụng API 9+ (2.3+) không? Nếu có, bạn chỉ cần thêm rằng trước khi kết nối nó, bạn nên được ok. Nếu bạn đang sử dụng 2,2 hoặc ít hơn, bạn nên sử dụng HttpClient từ gói org.apache. Nếu bạn đang làm cho 2.2 tôi sẽ thêm một số mã ví dụ. – DallaRosa

+0

Hiện tại nó được đặt thành 2.3 nhưng không chắc chắn chúng ta sẽ để nó như thế. Có thể thả nó xuống 2.2 nhưng không chắc chắn. Có vẻ như 99% các thiết bị ở đây là 2,3+ vì vậy nên được ok. – theblitz

11

Để duy trì phiên sử dụng HttpURLConnection bạn cần phải thực hiện phần này

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

chỉ một lần và không phải trên mỗi kết nối. Ứng cử viên tốt có thể khởi chạy ứng dụng bên trong Application.onCreate();

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