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

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

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

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

Редактировать:

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

Solutions Collecting From Web of "Повторное использование HttpURLConnection для сохранения сеанса"

Обычно сеансы не сохраняются на основе самого 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); 

РЕДАКТИРОВАТЬ:

Для тех, кто работает с уровнями 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

EDIT 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 } 

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

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

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