2011-09-15 73 views
8

我想在使用HttpGet連接到服務器時保留會話,我需要了解它如何處理Cookie。HttpGet會自動處理cookie嗎?

服務器開發人員說他自己處理所有的cookies。 我使用HttpGet請求訪問服務器,如下所示: 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. 我應該做更多的事情?他是否會自動將Cookie放在我的設備上,並且HttpGet方法知道要使用它來保留使用cookie的sessionID?

  2. 如何檢查cookie是否存在於我的設備上,以便知道會話是否「活着」?

  3. 如果我用下面的代碼來獲取餅乾:

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

請問HTTPGET仍然負責餅乾和以前一樣?

  1. 我看到DefaultHttpClient(上面的代碼中的mClient)有它自己的CookieStore。我如何保存它的cookies並在下次創建時加載它們?

回答

5

所以... 破解我的頭幾個小時,實現我自己的後原始的CookieStore,我發現Android Asynchronous Http Client的實現,其中包括一個很好的PersistentCookieStore,它非常棒! 簡單地添加的jar到我的項目,並用它如下:

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

,這就是它!當應用程序再次打開時,Cookie將被保存並重新使用。

謝謝詹姆斯史密斯,你在哪裏。你至少讓一個人開心。

如果有興趣的人在自己的原始執行(也適用),那就是:

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

關心餅乾,我還沒有。當我創建我的DefaultHttpClient並將httpclient.execute(httpget);設置爲here時,對象將在其上存儲會話。所以首先我做登錄,後來我可以使用我的API的私有功能。如果我想註銷,我創建了我的對象DefaultHttpClient的新實例或調用註銷功能。

所以,如果你想使用cookie的信息使用的CookieStore,如果不是隻使用單一實例來永葆對象DefaultHttpClient

+0

我看到DefaultHttpClient(移動客戶端在上面的代碼中)都有自己的CookieStore。我如何保存它的cookies並在下次創建時加載它們? –

+0

爲什麼你需要這樣做?下次您將使用新的cookie。但是如果你仍然需要存儲它,你可以在例子中看到代碼,我告訴你如何去做。 – Dayerman

+0

我需要能夠保存到cookie,所以我會知道用戶是否有服務器會話,即使用戶退出應用程序並再次打開它(我不知道如何在您發送的鏈接上執行此操作)。類似的東西在Facebook API中完成,只有他們使用Android瀏覽器才能做到。我找到了一個解決方案,並將其發佈在此處作爲答案。無論如何,謝謝你的幫助! –