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

Повторное использование HttpURLConnection для сохранения сеанса

У нас есть приложение для Android, которое требует от пользователя ввода ответа на Captcha. Captcha создается на нашем сервере. Когда ответы отправляются на сервер для проверки.

Проблема в том, что, поскольку я должен закрыть HttpURLConnection после запроса на Captcha I, я обнаружил, что ответ выполняется на другом сеансе на сервере. Из-за этого проверка Captcha не выполняется, поскольку она зависит от сеанса.

Есть ли способ сохранить соединение живым или я должен следовать другому пути? Я знаю, что в эквивалентном приложении iPhone они остаются "подключенными" и, следовательно, имеют один и тот же сеанс.

Edit:

    CookieManager cookieManager = new CookieManager();  
    CookieHandler.setDefault(cookieManager);

    URL urlObj = new URL(urlPath);
    conn = (HttpURLConnection) urlObj.openConnection();

    if (urlPath.toLowerCase().startsWith("https:")) {
        initializeHttpsConnection((HttpsURLConnection) conn);
    }
    conn.setRequestMethod("POST");
    conn.setRequestProperty("Content-Language", "en-US");
    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    conn.setRequestProperty("Content-Length", Integer.toString(bodyData.length));
    if (_sessionIdCookie != null) {
        conn.setRequestProperty("Cookie", _sessionIdCookie);
    }
    // Connect
    conn.setDoInput(true);
    conn.setDoOutput(true);
    conn.connect();
4b9b3361

Ответ 1

Обычно сеансы не сохраняются на основе самого http-соединения. Это не имеет никакого смысла. Сессии обычно сохраняются в памяти через файл cookie на стороне клиента и информацию о сеансе на стороне сервера. То, что вы должны сделать, это сохранить файлы cookie (ы), которые вы получаете, а затем установить эти (эти) файлы cookie при следующем подключении к серверу.

Чтобы узнать больше о том, как работать с сеансами и куки с классом HttpUrlConnection, прочитайте документацию: http://developer.android.com/reference/java/net/HttpURLConnection.html

Вот немного отрывок, чтобы вы начали:

Чтобы установить и поддерживать потенциально долгоживущий сеанс между клиент и сервер, HttpURLConnection включает в себя расширяемый файл cookie менеджер. Включите управление файлами cookie VM с помощью CookieHandler и CookieManager:

CookieManager cookieManager = new CookieManager();  
CookieHandler.setDefault(cookieManager);

EDIT:

Для тех, кто работает с уровнями API 8 или ниже, вам нужно будет использовать библиотеку Apache!

Здесь приведен код ссылки:

 // Create a local instance of cookie store
    CookieStore cookieStore = new BasicCookieStore();

    // Create local HTTP context
    HttpContext localContext = new BasicHttpContext();
    // Bind custom cookie store to the local context
    localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

    HttpGet httpget = new HttpGet("http://www.google.com/"); 

    System.out.println("executing request " + httpget.getURI());

    // Pass local context as a parameter
    HttpResponse response = httpclient.execute(httpget, localContext);

Приведенный выше код был взят из примеров библиотеки Apache. Это можно найти здесь: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientCustomContext.java

ИЗМЕНИТЬ 2: Прояснение:

Для библиотеки Apache вам нужно как-то "подключить" объект управления cookie с объектом соединения, и вы делаете это через объект HttpContext.

В случае HttpUrlConnection, что не нужно. когда вы используете статический метод CookieHandler setDefault, вы устанавливаете общесистемный cookieHandler. Ниже выдержки из CookieHandler.java. Обратите внимание на имя переменной (из репозитория проекта Open Source Project (AOSP)):

 37 /**
 38      * Sets the system-wide cookie handler.
 39      */
 40     public static void setDefault(CookieHandler cHandler) {
 41         systemWideCookieHandler = cHandler;
 42     }

Ответ 2

Чтобы поддерживать сеанс с помощью HttpURLConnection, вам нужно выполнить эту часть

CookieManager cookieManager = new CookieManager();  
CookieHandler.setDefault(cookieManager);

только один раз, а не на каждое соединение. Хороший кандидат может быть при запуске приложения внутри Application.onCreate();