web-dev-qa-db-de.com

Android-Sitzungsverwaltung

Gibt es eine spezifische Bibliothek für die Android-Sitzungsverwaltung? Ich muss meine Sitzungen in einer normalen Android-App verwalten. nicht in WebView. Ich kann die Sitzung über meine Post-Methode einstellen. Wenn ich jedoch eine weitere Anfrage sende, ist diese Sitzung verloren. Kann mir jemand bei dieser Angelegenheit helfen?

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, auf denselben Host zuzugreifen, geht diese Sitzung verloren:

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

Ich erhalte den Antworttext der Anmeldeseite.

24
nala4ever

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 werden in Ihrem DefaultHttpClient-Objekt gespeichert. Anstatt für jede Anforderung eine neue DefaultHttpClient zu erstellen, behalten Sie sie bei, und verwenden Sie sie erneut. Ihre Sitzungscookies werden beibehalten.

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

38
CommonsWare

Das ist was ich für Beiträge verwende. Ich kann new httpClients mit dieser Methode verwenden, wobei phpsessid die PHP-Sitzungs-ID ist, die mit dem oben angegebenen Code aus dem Anmeldeskript extrahiert wurde.

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

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

Im Allgemeinen können Sie in Java HttpURLConnection auf diese Weise ein Cookie setzen/erhalten (hier ist der gesamte Verbindungsprozess). Der folgende Code befindet sich in run () meines ConnectingThread, von dem alle verbindenden Aktivitätsklassen erben. Alle verwenden einen gemeinsamen statischen sCookie-String, der mit allen Anforderungen gesendet wird. Daher können Sie einen allgemeinen Status wie An-/Abmelden beibehalten:

        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

Absolut transparente Methode, um eine Sitzung in Android-Apps aktiv zu lassen (Benutzer angemeldet oder was auch immer). Er verwendet den Apache DefaultHttpClient in einem Singleton und einen HttpRequest/Response-Interceptor.

Die SessionKeeper-Klasse prüft einfach, ob einer der Header Set-Cookie ist. Wenn dies der Fall ist, merkt es sich einfach. Der SessionAdder fügt der Anfrage einfach die Sitzungs-ID hinzu (falls nicht null). Auf diese Weise ist der gesamte Authentifizierungsprozess völlig 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