2012-05-24 7 views
7

Aquí está la descripción simple actual de mi aplicación. Utiliza alguna API de servidor remoto, que utiliza una sesión HTTP estándar. Actividad de inicio de sesión. Llama a la clase de autenticación, pasando el inicio de sesión y la contraseña.¿Cómo mantener las cookies de sesión HTTP en HttpContext entre actividades en 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) 
} 

En autenticación exitosa, servidor remoto crea sesión HTTP standart, enviándome galleta, guardado en CookiStore. Después de iniciar sesión, loginresponse inicia la actividad principal. Ahí deseo tener una clase universal para todas las solicitudes API.

¿Cómo puedo mantener correcta la información de la sesión HTTP, creada después de iniciar sesión, entre todas las actividades, y pasarla a las funciones necesarias para los métodos API correspondientes?

+0

Por último, se encontraron soluciones en http://stackoverflow.com/questions/4146861/android-httpclient-persistant-cookies y HTTP : //stackoverflow.com/questions/708012/android-how-to-declare-global-variables – uzer

Respuesta

0

Usted puede hacer algo como lo siguiente:

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

Si utiliza un marco DI como Dagger, se puede mantener un HttpContext entre las actividades e inyectarlo donde quieras!

1

Puede utilizar una clase singleton que sería algo como esto:

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; 
    } 
} 
Cuestiones relacionadas