2012-05-23 24 views
12

Tenemos una aplicación de Android que requiere que el usuario ingrese una respuesta a un Captcha. Captcha se genera en nuestro servidor. Cuando las respuestas, se envía al servidor para verificar.Reutilizando HttpURLConnection para mantener viva la sesión

El problema es que, dado que tengo que cerrar la HttpURLConnection después de la solicitud de Captcha I, encuentro 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 alguna manera de mantener viva la conexión o debería seguir una ruta diferente? Sé que en la aplicación de iPhone equivalente permanecen "conectadas" 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(); 

Respuesta

13

Normalmente, las sesiones no se mantienen en base a la misma conexión HTTP. Eso no tendría ningún sentido. Las sesiones normalmente se mantienen activas a través de una cookie en el lado del cliente y la información de la sesión en el lado del servidor. Lo que tienes que hacer es guardar las cookies que estás recibiendo y luego establecer esas (esas) cookies 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, leer la documentación: http://developer.android.com/reference/java/net/HttpURLConnection.html

Aquí un pequeño fragmento para empezar:

Establecer y mantener un potencial sesión de larga duración entre el cliente y el servidor , HttpURLConnection incluye un administrador extensible de cookie . Habilitar la administración de cookies VM-ancha utilizando CookieHandler y CookieManager:

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

EDIT:

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

Aquí hay 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 de arriba fue tomada a partir de ejemplos de la biblioteca 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 Apache necesita de alguna manera "conectar" el objeto de gestión de cookies con el objeto de conexión y lo hace a través el objeto HttpContext.

En el caso de HttpUrlConnection eso no es necesario. cuando utiliza el método estático de CookieHandler setDefault, 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 (desde el repositorio de Android Open Source Project (AOSP)):

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

Una vez que he definido el "CookieManager" ¿entonces agrego uno que contiene el sessionid? – theblitz

+0

Ok, tengo una pregunta importante para ti: ¿Estás usando API 9+ (2.3+)? Si es así, simplemente agrega que antes de conectarlo deberías estar bien. Si usa 2.2 o menos, debe usar HttpClient del paquete org.apache. Si lo haces para 2.2, agregaré un código de ejemplo. – DallaRosa

+0

Por el momento se establece en 2.3, pero no estoy seguro de que vamos a dejarlo así. Podría dejarlo caer arriba 2.2 pero no estoy seguro. Parece que el 99% de los dispositivos aquí son 2.3+, por lo que debería estar bien. – theblitz

11

Mantener sesión usando HttpURLConnection es necesario ejecutar esta parte

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

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

Cuestiones relacionadas