使用HTTPUrlConnection时如何保留cookie?
我已经开始使用推荐的广告,HTTPUrlConnection
并从移走了DefaultHTTPClient
。我无法重新粘合在一起的一件事是使用持久性Cookie存储。我想简单地将自定义cookie处理程序/管理器附加到我的连接中以存储cookie。Android文档并不是很有帮助,因为它将Cookie主题分为两行。
我以前使用过LoopJ PersistentCookieStore
,效果很好。
关于如何在Android中设置可以附加到我的HTTPUrlConnection
自动保存和检索cookie 的持久性cookie存储的想法?
谢谢
-
我花了几个小时,但我自己设法建立了一个自定义cookie存储。
您必须通过执行以下操作来附加它:
public class application extends Application { @Override public void onCreate() { super.onCreate(); CookieManager cmrCookieMan = new CookieManager(new MyCookieStore(this.objContext), CookiePolicy.ACCEPT_ALL); CookieHandler.setDefault(cmrCookieMan); } }
这是实际的存储空间:
/* * This is a custom cookie storage for the application. This * will store all the cookies to the shared preferences so that it persists * across application restarts. */ class MyCookieStore implements CookieStore { /* * The memory storage of the cookies */ private Map<URI, List<HttpCookie>> mapCookies = new HashMap<URI, List<HttpCookie>>(); /* * The instance of the shared preferences */ private final SharedPreferences spePreferences; /* * @see java.net.CookieStore#add(java.net.URI, java.net.HttpCookie) */ public void add(URI uri, HttpCookie cookie) { System.out.println("add"); System.out.println(cookie.toString()); List<HttpCookie> cookies = mapCookies.get(uri); if (cookies == null) { cookies = new ArrayList<HttpCookie>(); mapCookies.put(uri, cookies); } cookies.add(cookie); Editor ediWriter = spePreferences.edit(); HashSet<String> setCookies = new HashSet<String>(); setCookies.add(cookie.toString()); ediWriter.putStringSet(uri.toString(), spePreferences.getStringSet(uri.toString(), setCookies)); ediWriter.commit(); } /* * Constructor * * @param ctxContext the context of the Activity */ @SuppressWarnings("unchecked") public MyCookieStore(Context ctxContext) { spePreferences = ctxContext.getSharedPreferences("CookiePrefsFile", 0); Map<String, ?> prefsMap = spePreferences.getAll(); for(Map.Entry<String, ?> entry : prefsMap.entrySet()) { for (String strCookie : (HashSet<String>) entry.getValue()) { if (!mapCookies.containsKey(entry.getKey())) { List<HttpCookie> lstCookies = new ArrayList<HttpCookie>(); lstCookies.addAll(HttpCookie.parse(strCookie)); try { mapCookies.put(new URI(entry.getKey()), lstCookies); } catch (URISyntaxException e) { e.printStackTrace(); } } else { List<HttpCookie> lstCookies = mapCookies.get(entry.getKey()); lstCookies.addAll(HttpCookie.parse(strCookie)); try { mapCookies.put(new URI(entry.getKey()), lstCookies); } catch (URISyntaxException e) { e.printStackTrace(); } } System.out.println(entry.getKey() + ": " + strCookie); } } } /* * @see java.net.CookieStore#get(java.net.URI) */ public List<HttpCookie> get(URI uri) { List<HttpCookie> lstCookies = mapCookies.get(uri); if (lstCookies == null) mapCookies.put(uri, new ArrayList<HttpCookie>()); return mapCookies.get(uri); } /* * @see java.net.CookieStore#removeAll() */ public boolean removeAll() { mapCookies.clear(); return true; } /* * @see java.net.CookieStore#getCookies() */ public List<HttpCookie> getCookies() { Collection<List<HttpCookie>> values = mapCookies.values(); List<HttpCookie> result = new ArrayList<HttpCookie>(); for (List<HttpCookie> value : values) { result.addAll(value); } return result; } /* * @see java.net.CookieStore#getURIs() */ public List<URI> getURIs() { Set<URI> keys = mapCookies.keySet(); return new ArrayList<URI>(keys); } /* * @see java.net.CookieStore#remove(java.net.URI, java.net.HttpCookie) */ public boolean remove(URI uri, HttpCookie cookie) { List<HttpCookie> lstCookies = mapCookies.get(uri); if (lstCookies == null) return false; return lstCookies.remove(cookie); } }