2012-05-23 21 views
12

Abbiamo un'applicazione Android che richiede all'utente di inserire una risposta a un Captcha. Il Captcha è generato sul nostro server. Quando le risposte, viene inviato al server per la verifica.Riutilizzo HttpURLConnection in modo da mantenere attiva la sessione

Il problema è che dal momento che devo chiudere HttpURLConnection dopo la richiesta per il Captcha I, quindi trovare che la risposta è in esecuzione su una sessione diversa sul server. Per questo motivo il controllo Captcha fallisce dato che dipende dalla sessione.

C'è un modo per mantenere attiva la connessione o devo seguire un percorso diverso? So che nell'applicazione iPhone equivalente rimangono "connessi" e quindi hanno lo stesso sessionid.

Edit:

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(); 

risposta

13

Normalmente, le sessioni non sono tenuti in base alla connessione http stesso. Non avrebbe alcun senso. Le sessioni vengono normalmente mantenute attive tramite un cookie sul lato client e le informazioni di sessione sul lato server. Quello che devi fare è salvare i cookie che stai ricevendo e quindi impostare quei (quelli) cookie (s) la prossima volta che ti connetti al server.

Per ulteriori informazioni su come lavorare con le sessioni e biscotti con la classe HttpURLConnection, leggere la documentazione: http://developer.android.com/reference/java/net/HttpURLConnection.html

Ecco un piccolo estratto per iniziare:

per stabilire e mantenere un potenzialmente sessione longeva tra client e server , HttpURLConnection include un gestore di cookie estensibile . Abilita la gestione dei cookie VM a livello utilizzando CookieHandler e CookieManager:

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

EDIT:

Per chi lavora con i livelli di API 8 o inferiore, è necessario utilizzare la biblioteca di Apache!

Ecco alcuni codice di riferimento:

// 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); 

Il codice di cui sopra è stata presa dagli esempi della biblioteca del Apache. Si può trovare qui: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientCustomContext.java

EDIT 2: Rendere chiaro:

Per la libreria Apache è necessario in qualche modo "collegamento" l'oggetto gestione dei cookie con l'oggetto di connessione e lo si fa attraverso l'oggetto HttpContext.

Nel caso di HttpUrlConnection non è necessario. quando si utilizza il metodo statico di CookieHandler setDefault, si imposta cookieHandler a livello di sistema. Di seguito è riportato un estratto da CookieHandler.java.Si noti il ​​nome della variabile (dal Android Open Source Project AOSP) repository():

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

Una volta definito il "CookieManager", ne aggiungo uno che contenga il sessionid? – theblitz

+0

Ok, ho una domanda importante per te: stai usando API 9+ (2.3+)? SE sì, basta aggiungere che prima di connetterti dovresti essere ok. Se stai usando 2.2 o meno dovresti usare HttpClient dal pacchetto org.apache. Se lo fai per 2.2 aggiungerò del codice di esempio. – DallaRosa

+0

Al momento è impostato su 2.3 ma non siamo sicuri che lo lasceremo così. Potrebbe cadere in alto 2.2 ma non sono sicuro. Sembra che il 99% dei dispositivi qui sia 2.3+, quindi dovrebbe essere ok. – theblitz

11

Per mantenere sessione utilizzando HttpURLConnection è necessario eseguire questa parte

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

solo una volta e non su ogni connessione. Un buon candidato può partecipare al lancio dell'applicazione all'interno di Application.onCreate();

Problemi correlati