android cookies httpurlconnection android-cookiemanager

android - Cómo manejar las cookies en httpUrlConnection usando cookieManager



android-cookiemanager (5)

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

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 estoy agregando estas cookies a la siguiente conexión:

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

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


@ La respuesta de David es la mejor del montón. Es más fácil mantener un CookieManager local y escribir y leer manualmente desde la tienda de cookies asociada con este administrador de cookies.

Este código carga las cookies de una respuesta en el administrador 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 administrador 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 manejar las cookies.

Intenté usar una tienda de threadlocal y una extensión de CookieManager. Ninguno de estos enfoques funcionó en mi caso.


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

Creé la misma aplicación en iOS y no tuve el mismo problema porque NSUrlConnection nos hizo el mantenimiento de las cookies detrás de la escena. En Android, traté de agregar cookies manualmente

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

sin suerte

Finalmente leí this

y agregué las siguientes 2 líneas en algún lugar al comienzo de mi aplicación:

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

y todo funciona bien ahora


La respuesta aceptada puede funcionar, pero encontré una solución más simple. La solución de Gold Thumb no funcionó en mi caso. Ver mi respuesta conectando webView y httpUrlConnection


Ok, la forma correcta de hacerlo es así:

Obtenga cookies del encabezado de respuesta y cárguelos 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)); } }

Obtenga cookies de cookieManager y cárguelas en la 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())); }


usando java.net.HttpURLConnection y groovy, simplemente agregue URLConnection#addRequestProperty(String key, String value) adentro with cierre.

import java.net.HttpURLConnection HttpURLConnection createRequest(String chatRequestBody) { HttpURLConnection httpChatRequest = new URL("${endpoint}").openConnection() as HttpURLConnection httpChatRequest.with { doOutput = true requestMethod = ''POST'' //headers addRequestProperty("Content-Type", "application/json") addRequestProperty("Client-Platform", "android") //cookies addRequestProperty("Cookie", "cookie_key1=cookie_value1,cookie_key2=cookie_value2") getOutputStream().write(chatRequestBody.getBytes("UTF-8")) } httpChatRequest }