Reutilizando HttpURLConnection para mantener la sesión viva

Tenemos una aplicación de Android que requiere que el usuario ingrese una respuesta a una Captcha. La Captcha se genera en nuestro servidor. Cuando las respuestas, se envía al servidor para verificar.

El problema es que desde que tengo que cerrar la HttpURLConnection después de la solicitud de la Captcha I entonces encontrar que la respuesta se está ejecutando en una sesión diferente en el servidor. Debido a esto la comprobación de Captcha falla ya que depende de la sesión.

¿Hay una manera de mantener la conexión viva o debo seguir un camino diferente? Sé que en la aplicación equivalente del iPhone siguen siendo "conectados" y por lo tanto tienen el mismo sessionid.

Editar:

CookieManager cookieManager = new CookieManager(); CookieHandler.setDefault(cookieManager); URL urlObj = new URL(urlPath); conn = (HttpURLConnection) urlObj.openConnection(); if (urlPath.toLowerCase().startsWith("https:")) { initializeHttpsConnection((HttpsURLConnection) conn); } conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Language", "en-US"); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.setRequestProperty("Content-Length", Integer.toString(bodyData.length)); if (_sessionIdCookie != null) { conn.setRequestProperty("Cookie", _sessionIdCookie); } // Connect conn.setDoInput(true); conn.setDoOutput(true); conn.connect(); 

Normalmente, las sesiones no se mantienen basadas en la conexión http misma. Eso no tendría ningún sentido. Las sesiones normalmente se mantienen vivas a través de una cookie en el lado del cliente y la información de sesión en el lado del servidor. Lo que tienes que hacer es guardar la (s) cookie (s) que estás recibiendo y luego establecer esa cookie (s) la próxima vez que te conectes al servidor.

Para obtener más información sobre cómo trabajar con sesiones y cookies con la clase HttpUrlConnection, lea la documentación: http://developer.android.com/reference/java/net/HttpURLConnection.html

Aquí un pequeño extracto para empezar:

Para establecer y mantener una sesión potencialmente duradera entre el cliente y el servidor, HttpURLConnection incluye un gestor de cookies extensible. Habilitar la administración de galletas en toda la máquina virtual utilizando CookieHandler y CookieManager:

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

EDITAR:

Para aquellos que trabajan con niveles API 8 o inferior, tendrá que utilizar la biblioteca de Apache!

He aquí un código de referencia:

  // Create a local instance of cookie store CookieStore cookieStore = new BasicCookieStore(); // Create local HTTP context HttpContext localContext = new BasicHttpContext(); // Bind custom cookie store to the local context localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); HttpGet httpget = new HttpGet("http://www.google.com/"); System.out.println("executing request " + httpget.getURI()); // Pass local context as a parameter HttpResponse response = httpclient.execute(httpget, localContext); 

El código anterior se tomó de los ejemplos de la biblioteca de Apache. Se puede encontrar aquí: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientCustomContext.java

EDIT 2: Dejando claro:

Para la biblioteca de Apache necesitas de alguna manera "conectar" el objeto de la gerencia de la galleta con el objeto de la conexión y lo haces a través del objeto de HttpContext.

En caso HttpUrlConnection que no es necesario. Cuando utiliza el método estático setDefault de CookieHandler, está configurando el cookieHandler en todo el sistema. A continuación se muestra un extracto de CookieHandler.java. Tenga en cuenta el nombre de la variable (del repositorio del proyecto de Android Open Source (AOSP)):

  37 /** 38 * Sets the system-wide cookie handler. 39 */ 40 public static void setDefault(CookieHandler cHandler) { 41 systemWideCookieHandler = cHandler; 42 } 

Para mantener la sesión usando HttpURLConnection necesita ejecutar esta parte

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

Sólo una vez y no en cada conexión. El candidato bueno puede estar en el lanzamiento de la aplicación dentro de Application.onCreate();

  • Android, HttpURLConnection y manejo de credenciales incorrectas
  • Error de E / S durante la llamada al sistema,
  • Problema de corrupción de bases de datos precargado en la aplicación de Android
  • ¿Qué devuelve el método getResponseMessage () de HttpURLConnection?
  • HttpUrlConnection de Android: Publicar Multipart
  • Diferencia entre okhttp y httpurlconnection?
  • Android HttpURLConnection PUT a Amazon AWS S3 403 error
  • HttpURLConnection con POST "time out" en ICS, funciona en HC
  • Cómo cambiar de HttpClient a HttpUrlConnection
  • ArrayList a DavidWebb Android
  • ¿Por qué el valor de tiempo de espera no es respetado por HttpURLConnection de Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.