HttpGet会自动处理cookie吗?

时间:2011-09-15 07:50:10

标签: java android http cookies httpclient

我想在使用HttpGet连接到服务器时保留会话,我需要了解它如何处理cookie。

服务器开发人员说他自己处理所有cookie。 我使用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. 如果我使用以下代码获取cookie:

    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);
    
  4. HttpGet是否仍然像以前一样处理cookie?

    1. 我看到DefaultHttpClient(上面代码中的mClient)有自己的CookieStore。如何保存Cookie并在下次创建时加载它们?

3 个答案:

答案 0 :(得分:6)

所以... 在我开了几个小时并实现我自己的原始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));
    }

    }

}

答案 1 :(得分:1)

不,cookie不会自动处理。要自动保存cookie使用 BasicCookeStore

有关使用的更多信息,请访问:http://hc.apache.org/httpcomponents-client-ga/tutorial/html/statemgmt.html

另请参阅此答案:Android HttpClient persistent cookies

答案 2 :(得分:0)

我没有必要关心cookies。当我创建DefaultHttpClient并将httpclient.execute(httpget);作为here时,对象会在其上存储会话。所以首先我登录然后我可以使用我的API的私有函数。如果我想注销,我创建一个对象DefaultHttpClient的新实例或调用注销函数。

因此,如果您想使用cookie的信息,请使用CookieStore,如果不是仅仅使用单例实例来保持对象DefaultHttpClient