Вопрос по webview, session-cookies, httpclient, android – ANDROID: обмен сессией между Webview и httpclient

9

Я на самом деле вошел сеанс в моем 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);
Направьте трафик через прокси-сервер, такой как WebScarab или Fiddler, чтобы выяснить остающиеся различия между запросами WebView и httpclient. Robert

Ваш Ответ

2   ответа
10

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

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

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

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

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 с правильным доменом.

Ссылка не работает
15

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

Теперь реализация для getCookieFromAppCookieManager выглядит следующим образом:
Метод получает файлы cookie для заданного URL-адреса из приложения CookieManager. Приложение CookieManager управляет файлами cookie, используемыми экземплярами 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;
}
Не работает для меня ..
прекрасно работает для меня!
Я не могу вернуть сессионный cookie. Зачем?
хорошо работает для меня, если все, что вам нужно, это поделиться файлом cookie веб-просмотра с нативным кодом (т.е. httpclient)
Спасибо, что поделился Dahevos

Похожие вопросы