2012-05-24 17 views
7

Ecco la descrizione semplice corrente mia app. Utilizza alcune API del server remoto, che utilizza la sessione HTTP standart. Attività di accesso. Chiama auth class, passa login e password.Come mantenere i cookie di sessione HTTP in HttpContext tra le attività su Android?

public class Auth extends AsyncTask{ 
... 
private DefaultHttpClient client = new DefaultHttpClient(); 
private HttpContext localContext = new BasicHttpContext(); 
private CookieStore cookieStore = new BasicCookieStore(); 
... 
public void auth(String login, String password) { 
    localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 
    HttpPost request = new HttpPost(url); 
    ... 
} 
protected void onPostExecute(Boolean result){ 
    parent.loginresponse(result) 
} 

Su autenticazione di successo, server remoto crea sessione HTTP standart, mandandomi biscotto, salvato in CookiStore. Dopo l'accesso, loginresponse avvia l'attività principale. Lì vorrei avere una classe universale per tutte le richieste API.

Come si fa a rendere corrette le informazioni sulla sessione HTTP in tempo reale, create dopo il login, tra tutte le attività e passandole alle funzioni necessarie per i corrispondenti metodi API?

+0

Infine, sono state trovate soluzioni a http://stackoverflow.com/questions/4146861/android-httpclient-persistant-cookies e http : //stackoverflow.com/questions/708012/android-how-to-declare-global-variables – uzer

risposta

0

Si può fare qualcosa di simile al seguente:

HttpClient client = getNewHttpClient(); 
     // 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); 
     try { 
      request = new HttpPost(url); 
      // request.addHeader("Accept-Encoding", "gzip"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     if (postParameters != null && postParameters.isEmpty() == false) { 

      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
        postParameters.size()); 
      String k, v; 
      Iterator<String> itKeys = postParameters.keySet().iterator(); 
      while (itKeys.hasNext()) { 
       k = itKeys.next(); 
       v = postParameters.get(k); 
       nameValuePairs.add(new BasicNameValuePair(k, v)); 
      } 

      UrlEncodedFormEntity urlEntity = new UrlEncodedFormEntity(
        nameValuePairs); 
      request.setEntity(urlEntity); 

     } 
     try { 

      Response = client.execute(request, localContext); 
      HttpEntity entity = Response.getEntity(); 
      int statusCode = Response.getStatusLine().getStatusCode(); 
      Log.i(TAG, "" + statusCode); 

      Log.i(TAG, "------------------------------------------------"); 

      if (entity != null) { 
       Log.i(TAG, 
         "Response content length:" + entity.getContentLength()); 

      } 
      List<Cookie> cookies = cookieStore.getCookies(); 
      for (int i = 0; i < cookies.size(); i++) { 
       Log.i(TAG, "Local cookie: " + cookies.get(i)); 

      } 

      try { 
       InputStream in = (InputStream) entity.getContent(); 
       // Header contentEncoding = 
       // Response.getFirstHeader("Content-Encoding"); 
       /* 
       * if (contentEncoding != null && 
       * contentEncoding.getValue().equalsIgnoreCase("gzip")) { in = 
       * new GZIPInputStream(in); } 
       */ 
       BufferedReader reader = new BufferedReader(
         new InputStreamReader(in)); 
       StringBuilder str = new StringBuilder(); 
       String line = null; 
       while ((line = reader.readLine()) != null) { 

        Log.i(TAG, "" + str.append(line + "\n")); 
       } 
       in.close(); 
       response = str.toString(); 
       Log.i(TAG, "response" + response); 
      } catch (IllegalStateException exc) { 

       exc.printStackTrace(); 
      } 

     } catch (Exception e) { 

      Log.e("log_tag", "Error in http connection " + response); 

     } finally { 
      // When HttpClient instance is no longer needed, 
      // shut down the connection manager to ensure 
      // immediate deallocation of all system resources 
      // client.getConnectionManager().shutdown(); 
     } 

     return response; 
    enter code here 
0

Se si utilizza un quadro DI come Dagger, è possibile mantenere un HttpContext tra le attività ed iniettarlo dove si vuole!

1

È possibile utilizzare una classe Singleton che sarebbe simile a questa:

public class UserSession 
{ 
    private static UserSession sUserSession; 

    private DefaultHttpClient client; 
    private HttpContext localContext; 
    private CookieStore cookieStore; 

    public DefaultHttpClient getClient() { 
     return client; 
    } 

    public void setClient(DefaultHttpClient client) { 
     this.client = client; 
    } 

    public HttpContext getLocalContext() { 
     return localContext; 
    } 

    public void setLocalContext(HttpContext localContext) { 
     this.localContext = localContext; 
    } 

    public CookieStore getCookieStore() { 
     return cookieStore; 
    } 

    public void setCookieStore(CookieStore cookieStore) { 
     this.cookieStore = cookieStore; 
    } 

    public get(){ 
     if (sUserSession == null) 
     { 
      sUserSession = new UserSession(); 
     } 
     return sUserSession; 
    } 
} 
Problemi correlati