ANDROID: сеанс совместного доступа между Webview и httpclient

У меня фактически сеанс регистрации в моем WebView. Но я использую также httpclient для отправки и получения данных из Интернета. Я видел в Интернете, что невозможно получить содержимое WebView, поэтому мне нужно было использовать мой httpclient для получения данных из веб-службы.

Проблема в том, что этот веб-сервис использует сеансы … и мой сеанс находится в моем WebView, поэтому у клиента httpclient его нет, и я не могу получить доступ к содержимому веб-сервиса.

Я вижу много сообщений об этой проблеме, но я не понял решения.

Вот что я сделал на моем onPageStarted:

CookieManager mgr = CookieManager.getInstance(); Log.i( "URL", url ); Log.i("Cookie",mgr.getCookie("mywebsite.com")); String cookie_string = mgr.getCookie("mywebsite.com"); if(cookie_string.length() > 1) { Data.instance().getPref().edit().putString("cookie",cookie_string).commit(); } 

Я видел, что у меня такие вещи, поэтому я надеюсь, что они включают сессию: (я удаляю номер)

 __utma=......(number)......; __utmc=number; __utmz=number.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); wt3_eid=%number%number; wt3_sid=%number 

Тогда я не знаю, что делать, чтобы установить этот файл cookie в моем httpclient. Я стараюсь, что без успеха:

 HttpClient client = new DefaultHttpClient(); BasicCookieStore cookieStore = new BasicCookieStore(); String login_cookie_string = Data.instance().getPref().getString("cookie", ""); String[] cookie_parts = null; if(login_cookie_string.length()> 0) { //debug_view.setText(login_cookie_string); Log.d("COOKIE", login_cookie_string); cookie_parts = login_cookie_string.split(";"); for(int t=0;t < cookie_parts.length;t++) { String[] cookieContent = cookie_parts[t].split("="); Cookie login_cookie = new BasicClientCookie(cookieContent[0],cookieContent[1]); ((BasicClientCookie) login_cookie).setDomain("mywebsite.com"); cookieStore.addCookie(login_cookie); } } ((AbstractHttpClient) client).setCookieStore(cookieStore); 

Solutions Collecting From Web of "ANDROID: сеанс совместного доступа между Webview и httpclient"

Итак, это то, что я сделал, и это сработало для меня –

 HttpRequestBase request = new HttpGet(uri); request.addHeader("Cookie", getCookieFromAppCookieManager(uri.toString())); 

Теперь импликация для getCookieFromAppCookieManager выглядит следующим образом:
Метод получает файлы cookie для заданного URL-адреса из приложения CookieManager. Приложение CookieManager управляет куки-файлами, используемыми экземплярами WebView приложения.

 @param url the URL for which the cookies are requested @return value the cookies as a string, using the format of the 'Cookie' HTTP request header @throws MalformedURLException public static String getCookieFromAppCookieManager(String url) throws MalformedURLException { CookieManager cookieManager = CookieManager.getInstance(); if (cookieManager == null) return null; String rawCookieHeader = null; URL parsedURL = new URL(url); // Extract Set-Cookie header value from Android app CookieManager for this URL rawCookieHeader = cookieManager.getCookie(parsedURL.getHost()); if (rawCookieHeader == null) return null; return rawCookieHeader; } 

Следуйте этому туту:

http://metatroid.com/article/Android:%20handling%20web%20service%20authentication

=============================== Здесь содержание веб-страницы =====

Что-то, что вы можете обнаружить в Android, – это веб-аутентификация. Большинство веб-сайтов выдает файл cookie для отслеживания идентификаторов сеансов и входа пользователя в систему. Чтобы поддерживать эту аутентификацию, вам необходимо сохранить файлы cookie, синхронизированные между действиями и между http-клиентами и веб-просмотрами.

Метод, который я закончил, который, кажется, работает достаточно хорошо, состоял в том, чтобы создать класс, расширяющий приложение, а затем определить один HttpClient, который будет использоваться во всем остальном приложении. Этот код выглядит так:

 public class AppSettings extends Application { private static final DefaultHttpClient client = createClient(); @Override public void onCreate(){ } static DefaultHttpClient getClient(){ return client; } private static DefaultHttpClient createClient(){ BasicHttpParams params = new BasicHttpParams(); SchemeRegistry schemeRegistry = new SchemeRegistry(); schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); final SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory(); schemeRegistry.register(new Scheme("https", sslSocketFactory, 443)); ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry); DefaultHttpClient httpclient = new DefaultHttpClient(cm, params); httpclient.getCookieStore().getCookies(); return httpclient; } 

Этот класс также создает HttpClient, который подходит для AsyncTasks и создает несколько одновременных HTTP-запросов. Используя ThreadSafeClientConnManager для ClientConnectionManager, вы можете запускать HTTP-запросы внутри AsyncTasks, не заставляя силу закрываться, когда вы нажимаете кнопку «Назад» и начинаете вторую или третью.

Он также создает единый хранилище файлов cookie по умолчанию, доступ к которому возможен во всех ваших действиях. Вы использовали бы это в своих других действиях, вызвав метод getClient ().

Например

 public class SomeActivity extends Activity { static DefaultHttpClient mClient = AppSettings.getClient(); ... try { HttpGet httpget = new HttpGet('URL'); HttpResponse response; response = mClient.execute(httpget); ... } ... } 

Если вы считаете необходимым использовать веб-просмотр и нуждаетесь в нем для доступа и использования тех же файлов cookie, что и ваш клиент. Вы можете синхронизировать хранилище cookie клиента с помощью CookieManager: (в методе onPageStarted)

 DefaultHttpClient mClient = AppSettings.getClient(); Cookie sessionInfo; List<Cookie> cookies = mClient.getCookieStore().getCookies(); if (! cookies.isEmpty()){ CookieSyncManager.createInstance(getApplicationContext()); CookieManager cookieManager = CookieManager.getInstance(); for(Cookie cookie : cookies){ sessionInfo = cookie; String cookieString = sessionInfo.getName() + "=" + sessionInfo.getValue() + "; domain=" + sessionInfo.getDomain(); cookieManager.setCookie("example.com", cookieString); CookieSyncManager.getInstance().sync(); } } 

Вам нужно будет переключить example.com с правильным доменом.