24

Android oturum yönetimi için belirli bir kütüphane var mı? Oturumlarımı normal bir Android uygulamasında yönetmem gerekiyor. WebView’da değil. Oturumu postalama yöntemimden ayarlayabilirim. Ama başka bir istek gönderdiğimde oturumu kaybeder. Birisi bana bu konuda yardım edebilir mi? O oturumu kaybolur aynı ana erişmeye çalıştığınızdaAndroid oturum yönetimi

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

:

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

Ben giriş sayfası tepki vücut olsun.

cevap

38

Bunun Android ile ilgisi yoktur. HTTP erişimi için kullandığınız kütüphane olan Apache HttpClient ile ilgili her şeye sahiptir.

Oturum çerezleri DefaultHttpClient nesnesinde saklanır. Her istek için yeni bir DefaultHttpClient oluşturmak yerine, onu tutun ve yeniden kullanın; oturum çerezleriniz korunur.

Apache HttpClient here hakkında bilgi alabilir ve HttpClient here'da çerez yönetimi hakkında bilgi alabilirsiniz.

+0

Çok teşekkür ederim .. Bu yolu deneyeceğim – nala4ever

+0

Teşekkürler CommonsWare, Bu gerçekten sorunumu çözdü. Çok teşekkürler .. :) –

+2

Bu bağlantı nasıl ve bu http://foo.jasonhudgins.com/2009/08/http-connection-reuse-in-android.html – Sam

4

Bu, postalar için kullandığım şeydir. Yeni httpClients'u, phpsessid'un yukarıdaki kod kullanarak oturum açma komut dosyasından ayıklanan PHP oturum kimliği olduğu bu yöntemle kullanabilirim.

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

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

nasıl uygulanacağına dair fikir verin Jim için teşekkürler – nala4ever

3

Genellikle Java HttpURLConnection size/set bir çerez bu şekilde alabilirsiniz (burada bütün bağlantı süreçtir). Aşağıdaki kod, tüm bağlantı etkinliği sınıflarının devraldığı, benim ConnectingThread'in() çalışmasındadır. Tüm istekleri ile gönderilen tüm ortak statik sCookie dize. Bu nedenle açık/kapalı oturum olmak gibi ortak bir devlet koruyabilirsiniz: Android uygulamalarındaki (kullanıcı giriş veya her neyse) aktif bir oturum tutmak için

 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

Tamamen şeffaf bir şekilde. Bir Singleton ve bir HttpRequest/Response Interceptors içinde apache DefaultHttpClient kullanır.

SessionKeeper sınıfı, yalnızca başlıklardan birinin Set-Cookie olup olmadığını kontrol eder ve eğer yaparsa, basitçe hatırlar. SessionAdder yalnızca oturum kimliğini istek üzerine ekler (boş değilse). Bu şekilde, tüm kimlik doğrulama süreci tamamen şeffaf.

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

    } 
}