it-roy-ru.com

Управление сессиями Android

Существует ли специальная библиотека для управления сессиями Android? Мне нужно управлять своими сессиями в обычном приложении для Android. не в WebView. Я могу установить сессию из моего метода записи. Но когда я отправляю другой запрос, сеанс теряется. Может ли кто-нибудь помочь мне с этим вопросом?

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

Я получаю тело ответа на странице входа.

24
nala4ever

Это не имеет ничего общего с Android. Все это имеет отношение к Apache HttpClient, библиотеке, которую вы используете для доступа по HTTP.

Сессионные куки хранятся в вашем объекте DefaultHttpClient. Вместо того, чтобы создавать новую DefaultHttpClient для каждого запроса, удерживайте его и используйте повторно, и ваши сеансовые куки будут сохранены.

Вы можете прочитать об Apache HttpClient здесь и прочитать об управлении cookie в HttpClient здесь .

38
CommonsWare

Это то, что я использую для сообщений. Я могу использовать новый httpClients с этим методом, где phpsessid - это идентификатор сессии PHP, извлеченный из сценария входа в систему с использованием кода, который вы использовали выше.

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

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

Как правило, в Java HttpURLConnection вы можете установить/получить cookie таким образом (здесь весь процесс подключения). Приведенный ниже код находится в run () моего ConnectingThread, от которого наследуются все подключающиеся классы действий. Все разделяют общую статическую строку sCookie, которая отправляется со всеми запросами. Таким образом, вы можете поддерживать общее состояние, например вход/выключение:

        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

Полностью прозрачный способ сохранить сеанс активным (пользователь вошел в систему или что-то еще) в приложениях Android .... Он использует Apache DefaultHttpClient внутри Singleton и перехватчики HttpRequest/Response.

Класс SessionKeeper просто проверяет, является ли один из заголовков Set-Cookie, и если он это делает, он просто запоминает его…. SessionAdder просто добавляет идентификатор сеанса в запрос (если не ноль). Таким образом, весь процесс аутентификации полностью прозрачен.

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