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

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

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

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

благодаря

4 Solutions collect form web for “Как сохранять cookie при использовании HTTPUrlConnection?”

«Мне понадобилось несколько часов, но мне удалось создать собственное хранилище 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

  • java.lang.numberformatexception: недействительный double: ""
  • Android HTML.fromHTML () с изображениями?
  • Как найти программные приложения, запущенные в настоящее время, в Android?
  • Как я могу сделать ячейку в ListView в Android расширяться и сокращаться вертикально, когда ее касаются?
  • Преобразование строк в дату mm / dd / yy до YYYY-MM-DD в java
  • Запретить отображение клавиатуры при запуске
  • Фатальный сигнал 11 (SIGSEGV) при 0x00000000 (код = 1) - PhoneGap
  • Изменение языка ввода клавиатуры Programmatically
  • Как получить выбранный индекс RadioGroup в Android
  • Есть ли способ получить количество меток чисел, используемых в файле jar
  • Объем переменной, объявленной внутри цикла for
  • Давайте будем гением компьютера.