web-dev-qa-db-fra.com

Gestion de session Android

Existe-t-il une bibliothèque spécifique pour la gestion de session 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 lorsque j'envoie une autre demande, cette session est perdue. Quelqu'un peut-il m'aider avec cette affaire?

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 j'essaie d'accéder au même hôte, cette session est perdue:

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

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

24
nala4ever

Cela n'a rien à voir avec Android. Cela 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 une nouvelle DefaultHttpClient pour chaque demande, conservez-la et réutilisez-la. Les cookies de votre session seront conservés.

Vous pouvez en savoir plus sur Apache HttpClient ici et sur la gestion des cookies dans HttpClient ici .

38
CommonsWare

C'est ce que j'utilise pour les posts. Je peux utiliser new httpClients avec cette méthode, où phpsessid est l'identifiant de session PHP extrait du script de connexion à l'aide du code que vous avez ci-dessus.

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

nameValuePairs.add(new BasicNameValuePair("PHPSESSID",phpsessid));
4
Jim

En règle générale, 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 le run () de mon ConnectingThread, duquel toutes les classes d'activité se connectant héritent. Tous partagent une chaîne sCookie statique commune qui est envoyée avec toutes les demandes. Par conséquent, vous pouvez conserver un état commun, comme être connecté/déconnecté:

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

Un moyen totalement transparent de garder une session active (utilisateur connecté, ou autre) dans les applications Android. Il utilise Apache DefaultHttpClient dans un Singleton et un HttpRequest/Interceptors de réponse.

La classe SessionKeeper vérifie simplement si l'un des en-têtes est Set-Cookie et, si c'est le cas, elle s'en souvient simplement. Le SessionAdder ajoute simplement l'ID de session à la demande (si elle n'est pas nulle). 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();
            }
        }

    }
}
0
user344293