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