java cookies httpurlconnection cookiemanager

java - ¿Debería HttpURLConnection con CookieManager manejar automáticamente las cookies de sesión?



(1)

Tengo una aplicación Java (JDK 1.7.0_13) y estoy usando java.net.HttpURLConnection para conectarme a algunos servicios basados ​​en servlet que administran sesiones. Estoy intentando descubrir cómo usar java.net.CookieManager para rastrear las cookies de sesión. Al leer los documentos, me da la impresión de que la instalación de CookieManager con CookieHandler.setDefault (nuevo CookieManager ()) debería hacer que la gestión de cookies se realice automáticamente. Sin embargo, las múltiples solicitudes a la misma URL no parecen conservar las cookies. ¿Tengo que extraer manualmente las cookies de las respuestas y volver a enviarlas en las solicitudes por mi cuenta o es que CookieManager va a hacer esto automáticamente? Si CookieManager no lo hace, ¿qué valor agrega?

Para probar cosas, tengo un servlet que incrementa con éxito un contador cada vez que mi navegador visita una URL. Esto funciona bien desde Safari, FireFox y Chrome ... Sin embargo, no puedo hacer que funcione desde una aplicación Java independiente.

Aquí hay un programa de prueba muy simple para ilustrar lo que esperaba sería un trabajo simple. Instala el CookieManager al inicio y luego llama al método fetch (String urlString) repetidamente a medida que las URL se ingresan en la consola.

package com.brilliant.experimental; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.CookieHandler; import java.net.CookieManager; import java.net.HttpURLConnection; import java.net.URL; public class HttpFetcher { public static void fetch(String urlString) { try { URL url = new URL(urlString); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); InputStream in = conn.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); int status = conn.getResponseCode(); System.out.println("Status = " + status); String key; System.out.println("Headers-------start-----"); for (int i = 1; (key = conn.getHeaderFieldKey(i)) != null; i++) { System.out.println(key + ":" + conn.getHeaderField(i)); } System.out.println("Headers-------end-----"); System.out.println("Content-------start-----"); String inputLine; while ((inputLine = reader.readLine()) != null) { System.out.println(inputLine); } System.out.println("Content-------end-----"); in.close(); } catch (Exception e) { System.out.println(e); } } public static void main(String[] args) { CookieHandler.setDefault(new CookieManager()); for (int i = 0; i < args.length; i++) { fetch(args[i]); } InputStreamReader isr = new InputStreamReader(System.in); BufferedReader reader = new BufferedReader(isr); String prompt = "> "; String urlString; try { for (System.out.print(prompt); (urlString = reader.readLine()) != null; System.out.print(prompt)) { fetch(urlString); } } catch (IOException ioe) { System.out.println(ioe); } } }

Invocar mi servlet desde esta aplicación claramente devuelve una cookie de sesión del servidor. Sin embargo, al invocar nuevamente se obtiene una nueva cookie de sesión.

> http://localhost:8080/brilliant/TestServlet Status = 200 Headers-------start----- Server:Resin/4.0.34 Cache-Control:private Set-Cookie:JSESSIONID=aaaMp0uKke4gp9_-nUuZt; path=/ Content-Length:19 Date:Wed, 13 Feb 2013 18:02:31 GMT Headers-------end----- Content-------start----- Session count is 0 Content-------end----- > http://localhost:8080/brilliant/TestServlet Status = 200 Headers-------start----- Server:Resin/4.0.34 Cache-Control:private Set-Cookie:JSESSIONID=aaaZ-oPaC1I9WdEDoUuZt; path=/ Content-Length:19 Date:Wed, 13 Feb 2013 18:02:33 GMT Headers-------end----- Content-------start----- Session count is 0 Content-------end-----

Entonces, para resumir, ¿tengo que hacer algo más para hacer que CookieManager funcione automáticamente para mí, o tengo que recurrir a extraer manualmente las cookies de las respuestas y volver a enviarlas con las solicitudes?


Ejecuto tu código y lo reemplazo

CookieHandler.setDefault(new CookieManager());

por

CookieHandler.setDefault( new CookieManager( null, CookiePolicy.ACCEPT_ALL ) );

¡Funciona!