24

Có thư viện cụ thể để quản lý phiên Android không? Tôi cần quản lý các phiên của mình trong một ứng dụng Android thông thường. không có trong số WebView. Tôi có thể đặt phiên từ phương thức đăng bài của mình. Nhưng khi tôi gửi một yêu cầu khác, phiên đó bị mất. Ai đó có thể giúp tôi với vấn đề này?Quản lý phiên Android

DefaultHttpClient httpClient = new DefaultHttpClient(); 
HttpPost httppost = new HttpPost("My url"); 

HttpResponse response = httpClient.execute(httppost); 
List<Cookie> cookies = httpClient.getCookieStore().getCookies(); 

if (cookies.isEmpty()) { 
    System.out.println("None"); 
} else { 
    for (int i = 0; i < cookies.size(); i++) { 
     System.out.println("- " + cookies.get(i).toString()); 
    } 
} 

Khi tôi cố gắng truy cập vào các máy chủ cùng một phiên mà bị mất:

HttpGet httpGet = new HttpGet("my url 2"); 
HttpResponse response = httpClient.execute(httpGet); 

tôi nhận được phản ứng cơ thể trang đăng nhập.

Trả lời

38

Điều này không liên quan gì đến Android. Nó có mọi thứ để làm với Apache HttpClient, thư viện bạn đang sử dụng để truy cập HTTP.

Cookie phiên được lưu trữ trong đối tượng DefaultHttpClient của bạn. Thay vì tạo một DefaultHttpClient mới cho mọi yêu cầu, hãy giữ nó và sử dụng lại nó, và cookie phiên của bạn sẽ được duy trì.

Bạn có thể đọc về Apache HttpClient here và đọc về quản lý cookie trong HttpClient here.

+0

Cảm ơn bạn rất nhiều .. Tôi sẽ cố gắng theo cách đó – nala4ever

+0

Cảm ơn CommonsWare, Nó thực sự giải quyết được vấn đề của tôi. Cảm ơn rất nhiều .. :) –

+2

Liên kết này cung cấp cho và ý tưởng cách triển khai http://foo.jasonhudgins.com/2009/08/http-connection-reuse-in-android.html – Sam

4

Đây là những gì tôi sử dụng cho bài đăng. Tôi có thể sử dụng httpClients mới với phương pháp này trong đó phpsessid là id phiên PHP được trích xuất từ ​​tập lệnh đăng nhập bằng mã bạn có ở trên.

ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 

nameValuePairs.add(new BasicNameValuePair("PHPSESSID",phpsessid)); 
+0

Cảm ơn thông tin này Jim – nala4ever

3

Nói chung, trong Java HttpURLKết nối bạn có thể đặt/lấy cookie theo cách này (đây là toàn bộ quá trình kết nối). Đoạn mã dưới đây là trong phương thức ConnectionThread của tôi(), từ đó tất cả các lớp hoạt động kết nối kế thừa. Tất cả chia sẻ chuỗi sCookie tĩnh phổ biến được gửi cùng với tất cả các yêu cầu. Do đó, bạn có thể duy trì trạng thái chung như đang đăng nhập/tắt:

 HttpURLConnection conn = (HttpURLConnection) url.openConnection();    

     //set cookie. sCookie is my static cookie string 
     if(sCookie!=null && sCookie.length()>0){ 
      conn.setRequestProperty("Cookie", sCookie);     
     } 

     // Send data 
     OutputStream os = conn.getOutputStream(); 
     os.write(mData.getBytes()); 
     os.flush(); 
     os.close(); 

     // Get the response! 
     int httpResponseCode = conn.getResponseCode();   
     if (httpResponseCode != HttpURLConnection.HTTP_OK){ 
      throw new Exception("HTTP response code: "+httpResponseCode); 
     } 

     // Get the data and pass them to the XML parser 
     InputStream inputStream = conn.getInputStream();     
     Xml.parse(inputStream, Xml.Encoding.UTF_8, mSaxHandler);     
     inputStream.close(); 

     //Get the cookie 
     String cookie = conn.getHeaderField("set-cookie"); 
     if(cookie!=null && cookie.length()>0){ 
      sCookie = cookie;    
     } 

     /* many cookies handling:     
     String responseHeaderName = null; 
     for (int i=1; (responseHeaderName = conn.getHeaderFieldKey(i))!=null; i++) { 
      if (responseHeaderName.equals("Set-Cookie")) {     
      String cookie = conn.getHeaderField(i); 
      } 
     }*/     

     conn.disconnect();     
0

Hoàn toàn minh bạch để giữ phiên hoạt động (người dùng đăng nhập hoặc bất kỳ thứ gì) trong ứng dụng Android. Nó sử dụng apache DefaultHttpClient bên trong một Singleton và một HttpRequest/Response Interceptors.

Lớp SessionKeeper chỉ cần kiểm tra xem một trong các tiêu đề có phải là Đặt cookie hay không, và nếu có, nó chỉ đơn giản là ghi nhớ nó. SessionAdder chỉ cần thêm id phiên vào yêu cầu (nếu không phải là null). Bằng cách này, bạn toàn bộ quá trình xác thực là hoàn toàn minh bạch.

public class HTTPClients { 

    private static DefaultHttpClient _defaultClient; 
    private static String session_id; 
    private static HTTPClients _me; 
    private HTTPClients() { 

    } 
    public static DefaultHttpClient getDefaultHttpClient(){ 
     if (_defaultClient == null) { 
      _defaultClient = new DefaultHttpClient(); 
      _me = new HTTPClients(); 
      _defaultClient.addResponseInterceptor(_me.new SessionKeeper()); 
      _defaultClient.addRequestInterceptor(_me.new SessionAdder()); 
     } 
     return _defaultClient; 
    } 

    private class SessionAdder implements HttpRequestInterceptor { 

     @Override 
     public void process(HttpRequest request, HttpContext context) 
       throws HttpException, IOException { 
      if (session_id != null) { 
       request.setHeader("Cookie", session_id); 
      } 
     } 

    } 

    private class SessionKeeper implements HttpResponseInterceptor { 

     @Override 
     public void process(HttpResponse response, HttpContext context) 
       throws HttpException, IOException { 
      Header[] headers = response.getHeaders("Set-Cookie"); 
      if (headers != null && headers.length == 1){ 
       session_id = headers[0].getValue(); 
      } 
     } 

    } 
}