24

Czy istnieje specjalna biblioteka do zarządzania sesjami Androida? Muszę zarządzać swoimi sesjami w normalnej aplikacji na Androida. nie w WebView. Mogę ustawić sesję z mojej metody postu. Ale kiedy wysyłam kolejną prośbę o utratę sesji. Czy ktoś może mi pomóc w tej sprawie?Zarządzanie sesjami Androida

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

Przy próbie uzyskania dostępu do tego samego hosta, że ​​sesja jest przegrane:

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

mam ciało odpowiedzi strona logowania.

Odpowiedz

38

To nie ma nic wspólnego z Androidem. Ma to wszystko zrobić z Apache HttpClient, biblioteką, której używasz do uzyskiwania dostępu HTTP.

Pliki cookie sesji są przechowywane w obiekcie DefaultHttpClient. Zamiast tworzyć nowe DefaultHttpClient dla każdego żądania, przytrzymaj je i używaj ponownie, a pliki cookie sesji będą zachowane.

Możesz przeczytać o Apache HttpClient here i przeczytać o zarządzaniu plikami cookie w HttpClient here.

+0

Bardzo dziękuję .. Spróbuję w ten sposób – nala4ever

+0

Dzięki CommonsWare, Naprawdę rozwiązał mój problem. Wielkie dzięki .. :) –

+2

Ten link daje i pomysł, jak wdrożyć ten http://foo.jasonhudgins.com/2009/08/http-connection-reuse-in-android.html – Sam

4

To jest to, czego używam dla postów. Mogę użyć nowego httpClients z tą metodą, gdzie phpsessid jest identyfikatorem sesji PHP wyodrębnionym ze skryptu logowania za pomocą kodu, który masz powyżej.

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

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

Dzięki za informację Jim – nala4ever

3

Ogólnie w Javie HttpURLConnection można ustawić/uzyskać ciasteczko w ten sposób (tutaj jest cały proces łączenia). Poniższy kod znajduje się w moim uruchomieniu programu ConnectingThread(), z którego dziedziczą wszystkie połączone klasy aktywności. Wszystkie mają wspólny statyczny ciąg sCookie, który jest wysyłany ze wszystkimi żądaniami. Dlatego można utrzymać wspólny stan jak być zalogowany/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

Całkowicie przejrzysty sposób, aby zachować sesję aktywny (użytkownik zalogowany, lub cokolwiek) w aplikacji na Androida. Używa apache DefaultHttpClient wewnątrz Singleton i HttpRequest/Response Interceptors.

Klasa SessionKeeper sprawdza, czy jednym z nagłówków jest Set-Cookie, a jeśli tak, to po prostu go zapamiętuje. SessionAdder dodaje po prostu identyfikator sesji do żądania (jeśli nie jest pusta). W ten sposób cały proces uwierzytelniania jest całkowicie przejrzysty.

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

    } 
} 
Powiązane problemy