2011-09-15 16 views
8

Tôi muốn duy trì một phiên trong khi kết nối với máy chủ bằng cách sử dụng HttpGet và tôi cần phải hiểu cách xử lý cookie.HttpGet có xử lý cookie tự động không?

Nhà phát triển máy chủ cho biết rằng anh ấy tự xử lý tất cả nội dung của cookie. Tôi sử dụng yêu cầu HttpGet để truy cập vào máy chủ như sau: InputStream isResponse = null;

HttpGet httpget = new HttpGet(strUrl); 
    HttpResponse response = mClient.execute(httpget); 

    HttpEntity entity = response.getEntity(); 
    isResponse = entity.getContent(); 
    responseBody = convertStreamToString(isResponse); 

    return responseBody; 
  1. Tôi có nên làm điều gì đó nhiều hơn? Liệu anh ta đặt cookie trên thiết bị của tôi một cách tự động và phương pháp HttpGet biết sử dụng nó để giữ sessionID bằng cách sử dụng cookie?

  2. Làm cách nào để kiểm tra xem cookie có tồn tại trên thiết bị của tôi hay không, để biết phiên có còn "hoạt động" không?

  3. Trong trường hợp tôi sử dụng đoạn mã sau để lấy cái bánh:

    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(strUrl); 
    HttpResponse response = mClient.execute(httpget,localContext); 
    

nào HttpGet vẫn xử lý các tập tin cookie giống như trước?

  1. Tôi thấy rằng DefaultHttpClient (mClient trong mã ở trên) có CookieStore riêng. Làm cách nào để lưu cookie và tải chúng vào lần tiếp theo tôi tạo cookie?

Trả lời

5

Vậy ... Sau nứt đầu tôi trong nhiều giờ và thực hiện của riêng tôi nguyên tắc CookieStore, tôi đã tìm thấy việc triển khai Android Asynchronous Http Client, bao gồm PersistentCookieStore đẹp mắt hoạt động tuyệt vời! Chỉ cần thêm bình vào dự án của tôi và sử dụng nó như sau:

PersistentCookieStore cookieStore = new PersistentCookieStore(context); 
DefaultHttpClient mClient = new DefaultHttpClient();  
mClient.setCookieStore(cookieStore); 

và đó là nó! Các cookie được lưu và sử dụng lại khi ứng dụng được mở lại.

Cảm ơn James Smith, bạn đã từng ở đâu. Bạn đã làm ít nhất một người đàn ông hạnh phúc.

Nếu bất cứ ai quan tâm đến việc thực hiện nguyên thủy của riêng tôi (mà cũng làm việc) ở đây là:

package com.pinhassi.android.utilslib; 

import java.util.Date; 
import java.util.List; 

import org.apache.http.cookie.Cookie; 
import org.apache.http.impl.client.BasicCookieStore; 
import org.apache.http.impl.cookie.BasicClientCookie; 

import android.content.Context; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 

public class MyPersistentCookieStore extends BasicCookieStore { 
private static final String COOKIES_LIST = "CookiesList"; 
private static final String COOKIES_NAMES = "CookiesNames"; 

private Context mContext; 
/** 
* 
*/ 
public MyPersistentCookieStore(Context context) { 
    super(); 
    mContext = context; 
    load(); 
} 

@Override 
public synchronized void clear(){ 
    super.clear(); 
    save(); 
} 

@Override 
public synchronized boolean clearExpired(Date date){ 
    boolean res = super.clearExpired(date); 
    save(); 
    return res; 
} 

@Override 
public synchronized void addCookie(Cookie cookie){ 
    super.addCookie(cookie); 
    save(); 
} 

@Override 
public synchronized void addCookies(Cookie[] cookie){ 
    super.addCookies(cookie); 
    save(); 
} 

public synchronized void save() 
{ 
    Editor editor = mContext.getSharedPreferences(COOKIES_LIST, Context.MODE_PRIVATE).edit(); 
    editor.clear(); 
    List <Cookie> cookies = this.getCookies(); 
    StringBuilder sb = new StringBuilder(); 
    for (Cookie cookie : cookies) 
    { 
     editor.putString(cookie.getName(),cookie.getValue()); 
     sb.append(cookie.getName()+";"); 
    } 
    editor.putString(COOKIES_NAMES,sb.toString()); 
    editor.commit(); 
} 

public synchronized void load() 
{ 
    SharedPreferences prefs = mContext.getSharedPreferences(COOKIES_LIST, Context.MODE_PRIVATE); 
    String [] cookies = prefs.getString(COOKIES_NAMES,"").split(";"); 
    for (String cookieName : cookies){ 
     String cookieValue = prefs.getString(cookieName, null); 
     if (cookieValue!=null) 
      super.addCookie(new BasicClientCookie(cookieName,cookieValue)); 
    } 

    } 

} 
0

tôi đã không phải quan tâm đến các tập tin cookie. Khi tôi tạo DefaultHttpClient và làm httpclient.execute(httpget); làm here đối tượng lưu trữ phiên trên đó. Vì vậy, đầu tiên tôi đăng nhập và sau đó tôi có thể sử dụng các chức năng riêng của API của tôi. Nếu tôi muốn đăng xuất, tôi tạo một đối tượng mới của đối tượng DefaultHttpClient hoặc gọi chức năng đăng xuất.

Vì vậy, trong trường hợp bạn muốn sử dụng thông tin của cookie sẽ sử dụng CookieStore, nếu không chỉ cần sử dụng một ví dụ singleton để duy trì sự sống của đối tượng DefaultHttpClient

+0

Tôi thấy rằng DefaultHttpClient (mClient trong đoạn code trên) có CookieStore riêng của mình. Làm cách nào để lưu cookie và tải chúng vào lần tiếp theo tôi tạo cookie? –

+0

Tại sao bạn cần phải làm điều đó? Lần tới bạn sẽ sử dụng một cookie mới. Nhưng nếu bạn vẫn cần phải lưu trữ nó, bạn có thể thấy mã trong ví dụ tôi đã nói với bạn làm thế nào để làm điều đó. – Dayerman

+0

Tôi cần có thể lưu vào cookie để tôi biết nếu người dùng có phiên làm việc với máy chủ ngay cả khi người dùng thoát khỏi ứng dụng và mở lại nó (tôi không thể làm thế nào để thực hiện nó trên liên kết bạn đã gửi). Một cái gì đó tương tự được thực hiện trong API facebook, chỉ có họ sử dụng trình duyệt Android để làm điều đó. Tôi tìm thấy một giải pháp và xuất bản nó ở đây như một câu trả lời. Cảm ơn rất nhiều vì đã giúp đỡ bạn! –

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