Cómo manejar las cookies en httpUrlConnection usando cookieManager
Tengo una solicitud de servidor que devuelve varias cookies, así:
- Java.io.IOException: No se han encontrado problemas de autenticación
- Para transferir el archivo de PC a Android dispositivo a través de usb
- Android descargar pdf de url luego abrirlo con un lector de pdf
- Error android, httpurlconnection
- Mantener sesión entre llamadas HttpUrlConnection (Native / Webview)
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 …
- ¿Por qué URLConnection tiempo de espera después de 6 + minutos en lugar de 5 segundos?
- Obtener java.net.SocketTimeoutException: La conexión se agotó en android
- EPIPE (Broken pipe) durante la carga?
- Pase las cookies de HttpURLConnection (java.net.CookieManager) a WebView (android.webkit.CookieManager)
- Java HttpURLConnection VS Android HttpURLConnection
- Android: java.net.protocolException no admite salida
- HttpURLConnection con POST "time out" en ICS, funciona en HC
- Establecer setChunkedStreamingMode en HttpURLConnection no puede entregar datos al servidor
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
- ¿Cómo obtener valor de LinkedHashMap basado en el índice no en la clave?
- Cómo pasar ArrayList <CustomeObject> de una actividad a otra?