24

Existe-t-il une bibliothèque spécifique pour la gestion des sessions Android? Je dois gérer mes sessions dans une application Android normale. pas dans WebView. Je peux définir la session à partir de ma méthode de publication. Mais quand j'envoie une autre requête, cette session est perdue. Quelqu'un peut-il m'aider avec cette question?Gestion des sessions Android

DefaultHttpClient httpClient = new DefaultHttpClient(); 
HttpPost httppost = new HttpPost("My url"); 

HttpResponse response = httpClient.execute(httppost); 
List<Cookie> cookies = httpClient.getCookieStore().getCookies(); 

if (cookies.isEmpty()) { 
    System.out.println("None"); 
} else { 
    for (int i = 0; i < cookies.size(); i++) { 
     System.out.println("- " + cookies.get(i).toString()); 
    } 
} 

Lorsque je tente d'accéder à la même hôte de cette session est perdue:

HttpGet httpGet = new HttpGet("my url 2"); 
HttpResponse response = httpClient.execute(httpGet); 

Je reçois la page de connexion corps de réponse.

Répondre

38

Cela n'a rien à voir avec Android. Il a tout à voir avec Apache HttpClient, la bibliothèque que vous utilisez pour l'accès HTTP.

Les cookies de session sont stockés dans votre objet DefaultHttpClient. Au lieu de créer un nouveau DefaultHttpClient pour chaque requête, conserver et réutiliser, et vos cookies de session seront maintenus.

Vous pouvez lire à propos d'Apache HttpClient here et lire sur la gestion des cookies dans HttpClient here.

+0

Merci beaucoup .. Je vais essayer de cette façon – nala4ever

+0

Merci CommonsWare, Il a vraiment résolu mon problème. Merci beaucoup .. :) –

+2

Ce lien donne et idée comment mettre en œuvre ce http://foo.jasonhudgins.com/2009/08/http-connection-reuse-in-android.html – Sam

4

C'est ce que j'utilise pour les publications. Je peux utiliser le nouveau httpClients avec cette méthode où phpsessid est l'identifiant de session PHP extrait du script de connexion en utilisant le code que vous avez ci-dessus.

ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 

nameValuePairs.add(new BasicNameValuePair("PHPSESSID",phpsessid)); 
+0

Merci pour l'info Jim – nala4ever

3

Généralement, dans Java HttpURLConnection vous pouvez définir/obtenir un cookie de cette façon (voici le processus de connexion complet). Le code ci-dessous est dans run() de ma connectionThread, à partir de laquelle toutes les classes d'activités de connexion héritent. Tous partagent une chaîne sCookie statique commune qui est envoyée avec toutes les demandes. Par conséquent, vous pouvez maintenir un état commun comme étant connecté/off:

 HttpURLConnection conn = (HttpURLConnection) url.openConnection();    

     //set cookie. sCookie is my static cookie string 
     if(sCookie!=null && sCookie.length()>0){ 
      conn.setRequestProperty("Cookie", sCookie);     
     } 

     // Send data 
     OutputStream os = conn.getOutputStream(); 
     os.write(mData.getBytes()); 
     os.flush(); 
     os.close(); 

     // Get the response! 
     int httpResponseCode = conn.getResponseCode();   
     if (httpResponseCode != HttpURLConnection.HTTP_OK){ 
      throw new Exception("HTTP response code: "+httpResponseCode); 
     } 

     // Get the data and pass them to the XML parser 
     InputStream inputStream = conn.getInputStream();     
     Xml.parse(inputStream, Xml.Encoding.UTF_8, mSaxHandler);     
     inputStream.close(); 

     //Get the cookie 
     String cookie = conn.getHeaderField("set-cookie"); 
     if(cookie!=null && cookie.length()>0){ 
      sCookie = cookie;    
     } 

     /* many cookies handling:     
     String responseHeaderName = null; 
     for (int i=1; (responseHeaderName = conn.getHeaderFieldKey(i))!=null; i++) { 
      if (responseHeaderName.equals("Set-Cookie")) {     
      String cookie = conn.getHeaderField(i); 
      } 
     }*/     

     conn.disconnect();     
0

façon totalement transparente pour maintenir une session active (utilisateur connecté, ou autre) dans les applications Android. Il utilise apache DefaultHttpClient à l'intérieur d'un singleton et un HttpRequest/Response Interceptors.

La classe SessionKeeper vérifie simplement si l'un des en-têtes est Set-Cookie, et si c'est le cas, il se souvient simplement de lui. SessionAdder ajoute simplement l'ID de session à la requête (sinon null). Ainsi, tout le processus d'authentification est totalement transparent.

public class HTTPClients { 

    private static DefaultHttpClient _defaultClient; 
    private static String session_id; 
    private static HTTPClients _me; 
    private HTTPClients() { 

    } 
    public static DefaultHttpClient getDefaultHttpClient(){ 
     if (_defaultClient == null) { 
      _defaultClient = new DefaultHttpClient(); 
      _me = new HTTPClients(); 
      _defaultClient.addResponseInterceptor(_me.new SessionKeeper()); 
      _defaultClient.addRequestInterceptor(_me.new SessionAdder()); 
     } 
     return _defaultClient; 
    } 

    private class SessionAdder implements HttpRequestInterceptor { 

     @Override 
     public void process(HttpRequest request, HttpContext context) 
       throws HttpException, IOException { 
      if (session_id != null) { 
       request.setHeader("Cookie", session_id); 
      } 
     } 

    } 

    private class SessionKeeper implements HttpResponseInterceptor { 

     @Override 
     public void process(HttpResponse response, HttpContext context) 
       throws HttpException, IOException { 
      Header[] headers = response.getHeaders("Set-Cookie"); 
      if (headers != null && headers.length == 1){ 
       session_id = headers[0].getValue(); 
      } 
     } 

    } 
}