Cómo manejar las cookies en httpUrlConnection usando cookieManager

Tengo una solicitud de servidor que devuelve varias cookies, así:

Introduzca aquí la descripción de la imagen

Así es como estoy almacenando estas cookies en el cookieManager:

HttpURLConnection connection = ... ; static java.net.CookieManager msCookieManager = new java.net.CookieManager(); msCookieManager.put(COOKIES_URI, connection.getHeaderFields()); 

Así es como añado estas cookies a la siguiente conexión:

 connection.setRequestProperty("Cookie", msCookieManager.getCookieStore().get(COOKIES_URI).toString()); 

¿Es la forma correcta de obtener las cookies de cookieManager ?, estoy bastante seguro de que hay una mejor …

Ok, la manera correcta de hacerlo es así:

Obtener cookies desde el encabezado de respuesta y cargarlos en cookieManager:

 static final String COOKIES_HEADER = "Set-Cookie"; HttpURLConnection connection = ... ; static java.net.CookieManager msCookieManager = new java.net.CookieManager(); Map<String, List<String>> headerFields = connection.getHeaderFields(); List<String> cookiesHeader = headerFields.get(COOKIES_HEADER); if (cookiesHeader != null) { for (String cookie : cookiesHeader) { msCookieManager.getCookieStore().add(null,HttpCookie.parse(cookie).get(0)); } } 

Obtener cookies desde cookieManager y cargarlos en conexión:

 if (msCookieManager.getCookieStore().getCookies().size() > 0) { // While joining the Cookies, use ',' or ';' as needed. Most of the servers are using ';' connection.setRequestProperty("Cookie", TextUtils.join(";", msCookieManager.getCookieStore().getCookies())); } 

He estado buscando / intentando durante días arreglar mi problema: no puedo acceder a recursos web protegidos incluso después de iniciar sesión correctamente

He creado la misma aplicación en iOS y no tienen el mismo problema porque NSUrlConnection hizo el mantenimiento de cookies para nosotros detrás de la escena. En Android, intenté agregar manualmente cookies

 connection.setRequestProperty("Cookie", "PHPSESSID=str_from_server") 

Sin ninguna suerte.

Finalmente leí esto

Y agregó las siguientes 2 líneas en algún lugar en el inicio de mi aplicación:

 CookieManager cookieManager = new CookieManager(); CookieHandler.setDefault(cookieManager); 

Y todo funciona bien ahora.

@ La respuesta de David es el mejor de la suerte. Es más fácil mantener un CookieManager local y escribir y leer manualmente desde el almacén de cookies asociado con este gestor de cookies.

Este código carga las Cookies de una respuesta en el gestor de cookies:

 /** * Gets Cookies from the response header and loads them into cookie manager * * @param conn instance of {@link HttpURLConnection} object * @param cookieManager the cookie manager({@link CookieManager} instance) in which the cookies are to be loaded<p>In case a null object is passed, the function will not perform any action and return back to the caller. </p> */ public static void loadResponseCookies(@Nullable HttpURLConnection conn,@Nullable CookieManager cookieManager) { //do nothing in case a null cokkie manager object is passed if (cookieManager == null || conn == null){ return; } List<String> cookiesHeader = conn.getHeaderFields().get(COOKIES_HEADER); if (cookiesHeader != null) { for (String cookieHeader : cookiesHeader) { List<HttpCookie> cookies; try { cookies = HttpCookie.parse(cookieHeader); } catch (NullPointerException e) { log.warn(MessageFormat.format("{0} -- Null header for the cookie : {1}",conn.getURL().toString(), cookieHeader.toString())); //ignore the Null cookie header and proceed to the next cookie header continue; } if (cookies != null) { Debug("{0} -- Reading Cookies from the response :", conn.getURL().toString()); for (HttpCookie cookie : cookies) { Debug(cookie.toString()); } if (cookies.size() > 0) { cookieManager.getCookieStore().add(null, HttpCookie.parse(cookieHeader).get(0)); } } } } } 

Este código rellena el objeto HttpUrlConnection con las cookies asociadas con el gestor de cookies:

 public void populateCookieHeaders(HttpURLConnection conn) { if (this.cookieManager != null) { //getting cookies(if any) and manually adding them to the request header List<HttpCookie> cookies = this.cookieManager.getCookieStore().getCookies(); if (cookies != null) { if (cookies.size() > 0) { Debug("{0} -- Adding Cookie Headers : ", url.toString()); for (HttpCookie cookie : cookies) { Debug(cookie.toString(), null); } //adding the cookie header conn.setRequestProperty(COOKIE_REQUEST_HEADER, StringUtils.join(cookies, ";")); } } } } 

Esta es la forma más segura de hilo para manejar las cookies.

He intentado usar un threadlocal cookiestore y una extensión de CookieManager. Ninguno de estos enfoques funcionó en mi caso.

La respuesta aceptada puede funcionar, pero encontré una solución más sencilla. Solución de pulgar de oro no funcionó en mi caso. Vea mi respuesta conectando webView y httpUrlConnection

  • Android HttpUrlConnection EOFException
  • Cómo detener HttpURLConnection.getInputStream ()?
  • URLConnection getContentLength () devuelve un valor negativo
  • Httpurlconnection es muy lento en Android 4.2
  • No se puede ejecutar un AlertDialog en un método doInbackground ()
  • Cadena de resultados de Android HttpUrlConnection truncada
  • HttpUrlConnection configuración Rango en Android se ignora
  • Android (Java) HttpURLConnection reintento silencioso en 'lectura' timeout
  • Android http keepalive solución, pero es permanente?
  • Usando HttpURLConnection y HttpsURLConnection para conectarse a un https?
  • DataOutputSteam me está lanzando una 'java.io.IOException: inesperado final de la secuencia'?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.