24

Gibt es eine bestimmte Bibliothek für Android-Sitzungsverwaltung? Ich muss meine Sitzungen in einer normalen Android App verwalten. nicht in WebView. Ich kann die Sitzung von meiner Post-Methode aus einstellen. Aber wenn ich eine andere Anfrage sende, ist diese Sitzung verloren. Kann mir jemand bei dieser Angelegenheit helfen?Android-Sitzungsverwaltung

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

Wenn ich versuche, den gleichen Host zuzugreifen, dass Sitzung verloren:

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

ich die Login-Seite Antworttext.

Antwort

38

Das hat nichts mit Android zu tun. Es hat alles mit Apache HttpClient zu tun, der Bibliothek, die Sie für den HTTP-Zugriff verwenden.

Sitzungscookies sind in Ihrem DefaultHttpClient Objekt gespeichert. Anstatt für jede Anfrage eine neue DefaultHttpClient zu erstellen, halten Sie diese fest und verwenden Sie sie erneut, und Ihre Sitzungscookies bleiben erhalten.

Sie können lesen über Apache HttpClient here und lesen Sie über Cookie-Management in HttpClient here.

+0

Vielen Dank .. ich auf diese Weise versuchen, – nala4ever

+0

Dank CommonsWare, Es ist mein Problem wirklich gelöst. Vielen Dank .. :) –

+2

Dieser Link geben und eine Idee, wie dies zu implementieren http://foo.jasonhudgins.com/2009/08/http-connection-reuse-in-android.html – Sam

4

Dies ist, was ich für Beiträge verwenden. Ich kann neue httpClients mit dieser Methode verwenden, wobei phpsessid die PHP Sitzungs-ID ist, die aus dem Anmeldeskript mit dem Code extrahiert wurde, den Sie oben haben.

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

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

Danke für die Info Jim – nala4ever

3

Allgemeinen in Java HttpURLConnection Sie können einstellen/erhalten ein Cookie auf diese Weise (hier ist die gesamte Verbindungsprozess). Der folgende Code ist in meinem ConnectingThread run(), von dem alle verbindende Aktivitätsklassen erben. Alle teilen gemeinsame statische sCookie Zeichenfolge, die mit allen Anfragen gesendet wird. Daher können Sie einen gemeinsamen Zustand halten, wie Ein/Aus protokolliert:

 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

Völlig transparent eine Sitzung aktiv zu halten (Benutzer angemeldet sind, oder was auch immer) in Android-Apps. Es verwendet den Apache DefaultHttpClient innerhalb eines Singleton und eines HttpRequest/Response Interceptors.

Die SessionKeeper-Klasse prüft einfach, ob einer der Header Set-Cookie ist, und wenn es dies tut, merkt es sich einfach. Der SessionAdder fügt der Anforderung einfach die Sitzungs-ID hinzu (wenn nicht null). Auf diese Weise ist der gesamte Authentifizierungsprozess vollständig 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(); 
      } 
     } 

    } 
}