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.
- HttpURLConnection.getInputStream siempre lanza IOException en android 2.1
- Android: Carga de una foto en Cloudinary con devolución de llamada de progreso en HttpURLConnection
- HttpURLConnection java.io.FileNotFoundException
- Digest autenticación en Android mediante HttpURLConnection
- Inconsistente HttpUrlConnection comportamientos en Android - cómo depurar?
¿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();
- Cómo configurar el tipo de contenido en HttpURLConnection?
- HttpURLConnection - "https: //" frente a "http: //"
- Cómo obtener la respuesta 401 sin tratarla usando try / catch en android
- Android descargar problemas de archivo binario
- GetHttpResponseCode () devuelve -1 en android 2.2
- Android HttpUrlConnection hace POST en lugar de GET
- Establecer setChunkedStreamingMode en HttpURLConnection no puede entregar datos al servidor
- FileNotFoundException para HttpURLConnection en Ice Cream Sandwich
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();
- ¿Por qué la dependencia de play-services-analytics no incluye las clases GooglePlayServicesUtil o GoogleApiAvailability?
- Detector paso a paso Android 4.4 y contador