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. 如果我使用下面的代码来获取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); 

HttpGet仍然像以前一样处理cookie吗?

  1. 我看到DefaultHttpClient(上面的代码中的mClient)有它自己的CookieStore。 我怎样才能保存它的cookies,并在下次创build它时加载它们?

Solutions Collecting From Web of "HttpGet会自动处理cookie吗?"

所以……在我的脑海里开了几个小时,并实现了我自己的原始CookieStore之后,我发现了AndroidasynchronousHttp客户端实现,其中包括一个很好的PersistentCookieStore,它非常棒! 简单地将jar添加到我的项目中,并按如下所示使用它:

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

就是这样! 当应用程序再次打开时,Cookie将被保存并重新使用。

谢谢你,詹姆斯史密斯,你在哪里。 你至less让一个人开心。

如果有人对我自己的原始实现感兴趣,那也是有效的:

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

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

更多的信息在这里使用: http : //hc.apache.org/httpcomponents-client-ga/tutorial/html/statemgmt.html

另请参阅此答案: Android HttpClient持久性Cookie

我不必关心cookies。 当我创build我的DefaultHttpClient并执行httpclient.execute(httpget); 因为这里对象存储会话。 所以首先我做login,后来我可以使用我的API的私人function。 如果我想注销,我创build我的对象DefaultHttpClient的新实例或调用注销function。

所以如果你想使用Cookie的信息,使用CookieStore,如果不是只使用一个单例实例来保持对象DefaultHttpClient