Как сохранять cookie при использовании HTTPUrlConnection?

Я начал использовать рекомендуемый HTTPUrlConnection и отошел от DefaultHTTPClient . Одной из вещей, которые я не смог скрыть вместе, является использование постоянного хранилища файлов cookie. Я хотел бы просто привязать обработчик / менеджер пользовательских cookie к моему соединению для хранения файлов cookie. Документация на Android не очень полезна, поскольку она включает тему куки в двух строках.

Раньше я использовал PersistentCookieStore от LoopJ, и это прекрасно работало.

Любая идея о том, как я могу настроить постоянный магазин cookie в Android, который я могу подключить к моему HTTPUrlConnection который автоматически сохраняет и извлекает cookies?

благодаря

«Мне понадобилось несколько часов, но мне удалось создать собственное хранилище 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> mapCookies = new HashMap>(); /* * 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 cookies = mapCookies.get(uri); if (cookies == null) { cookies = new ArrayList(); mapCookies.put(uri, cookies); } cookies.add(cookie); Editor ediWriter = spePreferences.edit(); HashSet setCookies = new HashSet(); 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 prefsMap = spePreferences.getAll(); for(Map.Entry entry : prefsMap.entrySet()) { for (String strCookie : (HashSet) entry.getValue()) { if (!mapCookies.containsKey(entry.getKey())) { List lstCookies = new ArrayList(); lstCookies.addAll(HttpCookie.parse(strCookie)); try { mapCookies.put(new URI(entry.getKey()), lstCookies); } catch (URISyntaxException e) { e.printStackTrace(); } } else { List 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 get(URI uri) { List lstCookies = mapCookies.get(uri); if (lstCookies == null) mapCookies.put(uri, new ArrayList()); return mapCookies.get(uri); } /* * @see java.net.CookieStore#removeAll() */ public boolean removeAll() { mapCookies.clear(); return true; } /* * @see java.net.CookieStore#getCookies() */ public List getCookies() { Collection> values = mapCookies.values(); List result = new ArrayList(); for (List value : values) { result.addAll(value); } return result; } /* * @see java.net.CookieStore#getURIs() */ public List getURIs() { Set keys = mapCookies.keySet(); return new ArrayList(keys); } /* * @see java.net.CookieStore#remove(java.net.URI, java.net.HttpCookie) */ public boolean remove(URI uri, HttpCookie cookie) { List lstCookies = mapCookies.get(uri); if (lstCookies == null) return false; return lstCookies.remove(cookie); } } 

Я использовал ответ выше, но изменил метод добавления на следующий, чтобы обрабатывать несколько файлов cookie из одного и того же URI (это хранилище cookie с GAE по какой-то причине обрабатывало токен сеанса и запоминающий токен как два отдельных файла cookie из того же URI) :

 public void add(URI uri, HttpCookie cookie) { List cookies = mapCookies.get(uri); if (cookies == null) { cookies = new ArrayList(); mapCookies.put(uri, cookies); } cookies.add(cookie); Editor ediWriter = spePreferences.edit(); HashSet setCookies = new HashSet(); setCookies.add(cookie.toString()); HashSet emptyCookieSet = new HashSet(); if(spePreferences.contains(uri.toString())){ emptyCookieSet = (HashSet) spePreferences.getStringSet(uri.toString(), emptyCookieSet); if(!emptyCookieSet.isEmpty()){ if(!emptyCookieSet.contains(cookie.toString())){ emptyCookieSet.add(cookie.toString()); ediWriter.putStringSet(uri.toString(), emptyCookieSet); } } } else{ ediWriter.putStringSet(uri.toString(), setCookies); } ediWriter.commit(); } 

А для доступа и создания комбинированного файла cookie:

 MyCookieStore store = new MyCookieStore(this.context, false); String cookie = TextUtils.join(",", store.get(new URI(URLString))); 

Присоединить к соединению:

 URL urlToRequest = new URL(stringPath); HttpURLConnection urlConnection = (HttpURLConnection) urlToRequest.openConnection(); urlConnection.setRequestProperty("Cookie", cookie); 

Есть некоторые основные проблемы во многих пользовательских реализациях CookieStore.

Первой проблемой является сериализация HttpCookie в строку – метод HttpCookie.toString () неприемлем для этого, потому что его результат не подходит для метода HttpCookie.parse (String header).

Вторая проблема: большая часть реализации CookieStore (например, здесь https://codereview.stackexchange.com/questions/61494/persistent-cookie-support-using-volley-and-httpurlconnection ) не учитывает формат HttpCookie. maxAge. Это количество секунд для сохранения файла cookie. Но если вы просто сохраняете свою ценность и через некоторое время откажетесь от нее, это будет неправильно. Вы должны преобразовать поле maxAge в нечто вроде «expire_at» и сохранить его вместо maxAge.

Оформить заказ в ссылке ниже. Он сохраняет cookies по имени хоста, как это делает оригинальная реализация java.net.InMemoryCookieStore.

Кроме того, он содержит SerializableHttpCookie, чтобы иметь возможность сериализовать полный HashMap в SharedPreferences.

https://gist.github.com/jacobtabak/78e226673d5a6a4c4367

  • Android - настройка тайм-аута для AsyncTask?
  • Использование активности камеры в Android
  • == и .equals () не работает в java
  • Получить объект JSON из ответа HTTP
  • Разбор JSON для JSON для JSON в JSONObject
  • Android Studio не смог найти действительный Jvm (относящийся к MAC OS)
  • Различия в виджетах для Android
  • Есть ли простой способ вывода двух столбцов на консоль в Java?
  • Как закодировать WAV в mp3 на устройстве Android
  • Java: вызов метода внешнего classа в анонимном внутреннем classе
  • $ 0 (название программы) в Java? Откройте для себя основной class?
  • Давайте будем гением компьютера.