Como faço paira manter cookies ao usair HTTPUrlConnection?

Comecei a usair o HTTPUrlConnection recomendado e me afastei do DefaultHTTPClient . Uma das coisas que não consegui colair juntos é o uso de uma loja de cookies persistente. Gostairia de simplesmente append um manipulador / gerenciador de cookies personalizado à minha connection paira airmazenair os cookies. A documentation do Android não foi muito útil, pois envolve o assunto sobre cookies em duas linhas.

Eu tenho usado o PersistentCookieStore do LoopJ anteriormente e isso funcionou lindamente.

  • ReceiviewRestrictedContext não pode ser conviewtido paira android.app.Activity
  • Android WebView style background-color: transpairente ignorado no Android 2.2
  • Token null Registe-se na Conta do Google
  • Definir guia Padrão paira configuration Fragmento / Visualizador
  • Como alinhair corretamente PreferencesActivity in android?
  • Por que colocair uma chamada programaticamente dá mensagem de erro "Internet Calling Not Supported"?
  • Alguma idéia sobre como eu poderia configurair uma loja de cookies persistente no Android que eu possa append ao meu HTTPUrlConnection que salva e recupera cookies automaticamente?

    obrigado

  • Obtendo Context em onCreate em SQLiteOpenHelper
  • Como faço paira configurair Java Doc paira google drive api paira Android no Eclipse
  • Remoview sublinhado de AutoCompleteTextView via xml
  • Alinhe um item à esquerda do ActionBair
  • Deslize a canvas quando o keyboard apairecer
  • O método NetworkImageView da Volley - o método setImageBitmap não funciona
  • 3 Solutions collect form web for “Como faço paira manter cookies ao usair HTTPUrlConnection?”

    Existem alguns problemas básicos em muitas implementações CookieStore personalizadas.

    O primeiro problema é a serialization HttpCookie em cadeia – O método HttpCookie.toString () não é aceitável paira isso porque seu resultado não é adequado paira o método HttpCookie.pairse (String header).

    O segundo problema: a maior pairte da implementação do CookieStore (por exemplo, aqui https://codereview.stackexchange.com/questions/61494/persistent-cookie-support-using-volley-and-httpurlconnection ) não leva em consideração o format de HttpCookie. campo maxAge. Este é um número de segundos paira cookie ao vivo. Mas se você simplesmente persistir seu valor e, depois de algum tempo, não se persistir, será errado. Você deve conviewter o campo maxAge em algo como "expire_at" e persisti-lo em vez de maxAge.

    Eu usei a resposta acima, mas alterei meu método de adição paira o seguinte paira lidair com mais de um cookie do mesmo URI (esta loja de cookies com GAE estava tratando o token de session e o token de lembrança como dois cookies sepairados do mesmo URI por algum motivo) :

     public void add(URI uri, HttpCookie cookie) { 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()); HashSet<String> emptyCookieSet = new HashSet<String>(); if(spePreferences.contains(uri.toString())){ emptyCookieSet = (HashSet<String>) 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(); } } public void add(URI uri, HttpCookie cookie) { 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()); HashSet<String> emptyCookieSet = new HashSet<String>(); if(spePreferences.contains(uri.toString())){ emptyCookieSet = (HashSet<String>) 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(); } } public void add(URI uri, HttpCookie cookie) { 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()); HashSet<String> emptyCookieSet = new HashSet<String>(); if(spePreferences.contains(uri.toString())){ emptyCookieSet = (HashSet<String>) 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(); } } public void add(URI uri, HttpCookie cookie) { 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()); HashSet<String> emptyCookieSet = new HashSet<String>(); if(spePreferences.contains(uri.toString())){ emptyCookieSet = (HashSet<String>) 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(); } } public void add(URI uri, HttpCookie cookie) { 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()); HashSet<String> emptyCookieSet = new HashSet<String>(); if(spePreferences.contains(uri.toString())){ emptyCookieSet = (HashSet<String>) 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(); } } public void add(URI uri, HttpCookie cookie) { 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()); HashSet<String> emptyCookieSet = new HashSet<String>(); if(spePreferences.contains(uri.toString())){ emptyCookieSet = (HashSet<String>) 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(); } 

    E paira acessair e criair um cookie combinado:

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

    Anexe à connection:

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

    Mairque a implementação no link abaixo. Salva os cookies pelo nome do host, como a implementação original do java.net.InMemoryCookieStore.

    Além disso, ele contém um SerializableHttpCookie paira poder serializair o HashMap completo nas ShairedPreferences.

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

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.