Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

Как правило, в Java HttpURLConnection вы можете установить/получить cookie таким образом (вот и весь процесс подключения). Код, приведенный ниже, находится в моем запуске ConnectionThread(), из которого наследуются все классы активности подключения. Все используют общую статическую строку 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();                

Ответ 4

Полностью прозрачный способ сохранения активности сеанса (входа пользователя или любого другого) в приложениях Android. Он использует apache DefaultHttpClient внутри Singleton и HttpRequest/Response Interceptors.

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

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

    }
}