Frage Android-Sitzungsverwaltung


Gibt es eine spezielle Bibliothek für die Verwaltung von Android-Sitzungen? 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?

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, auf dem die Sitzung verloren gegangen ist:

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

Ich erhalte den Antwortkörper der Anmeldeseite.


24
2017-11-19 12:23


Ursprung


Antworten:


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 gespeichert DefaultHttpClient Objekt. Anstatt ein neues zu erstellen DefaultHttpClient Halten Sie für jede Anfrage fest und verwenden Sie sie erneut, und Ihre Sitzungscookies bleiben erhalten.

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


38
2017-11-19 12:37



Dies ist, was ich für Beiträge verwende. Ich kann neu verwenden httpClients mit dieser Methode wo phpsessid ist der PHP Sitzungs-ID, die mit dem obigen Code aus dem Anmeldeskript extrahiert wurde.

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

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

4
2017-11-19 15:46



Im Allgemeinen können Sie in Java HttpURLConnection ein Cookie auf diese Weise setzen / erhalten (hier ist der 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. Aus diesem Grund können Sie einen gemeinsamen Status pflegen, indem Sie angemeldet sind:

        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
2018-02-24 09:44



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

Die SessionKeeper-Klasse überprüft einfach, ob einer der Header Set-Cookie ist, und wenn dies der Fall ist, merkt es sich diese einfach. Der SessionAdder fügt der Anfrage einfach die Session-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();
            }
        }

    }
}

0
2018-04-06 06:24