Проблема с файлом cookie в WebView Android - PullRequest
80 голосов
/ 31 октября 2009

У меня есть сервер, который отправляет моему приложению для Android файл cookie сеанса, который будет использоваться для аутентифицированное общение. Я пытаюсь загрузить WebView с URL указывая на тот же сервер, и я пытаюсь пройти в сеансе куки для аутентификации. Я наблюдаю, что это работает с перерывами, но я понятия не имею, почему. Я использую тот же файл cookie сеанса, чтобы делать другие вызовы на моем сервере, и они никогда не терпят неудачу при аутентификации. Я наблюдаю эту проблему только при попытке загрузить URL в WebView, и это происходит не каждый раз. Очень расстраивает.

Ниже приведен код, который я использую для этого. Любая помощь будет оценена.

String myUrl = ""http://mydomain.com/"; 
CookieSyncManager.createInstance(this); 
CookieManager cookieManager = CookieManager.getInstance(); 
Cookie sessionCookie =  getCookie(); 
if(sessionCookie != null){ 
    String cookieString = sessionCookie.getName() +"="+sessionCookie.getValue()+"; domain="+sessionCookie.getDomain(); 
    cookieManager.setCookie(myUrl, cookieString); 
    CookieSyncManager.getInstance().sync(); 
} 

WebView webView = (WebView) findViewById(R.id.webview); 
webView.getSettings().setBuiltInZoomControls(true); 
webView.getSettings().setJavaScriptEnabled(true); 
webView.setWebViewClient(new MyWebViewClient()); 
webView.loadUrl(myUrl);

Ответы [ 14 ]

51 голосов
/ 28 февраля 2010

Спасибо justingrammens ! Это сработало для меня, мне удалось поделиться cookie в моих запросах DefaultHttpClient и активности WebView:

//------- Native request activity
private DefaultHttpClient httpClient;
public static Cookie cookie = null;

//After Login
List<Cookie> cookies = httpClient.getCookieStore().getCookies();
for (int i = 0; i < cookies.size(); i++) {
    cookie = cookies.get(i);
}

//------- Web Browser activity
Cookie sessionCookie = myapp.cookie;
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
if (sessionCookie != null) {
    cookieManager.removeSessionCookie();
    String cookieString = sessionCookie.getName() + "=" + sessionCookie.getValue() + "; domain=" + sessionCookie.getDomain();
    cookieManager.setCookie(myapp.domain, cookieString);
    CookieSyncManager.getInstance().sync();
}   
15 голосов
/ 28 июня 2012

Решение: Webview CookieSyncManager

CookieSyncManager cookieSyncManager = CookieSyncManager.createInstance(mWebView.getContext());
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();
cookieManager.setCookie("http://xx.example.com","mid="+MySession.GetSession().sessionId+" ; Domain=.example.com");
cookieSyncManager.sync();

String cookie = cookieManager.getCookie("http://xx.example.com");

Log.d(LOGTAG, "cookie ------>"+cookie);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebViewClient(new TuWebViewClient());
mWebView.loadUrl("http://xx.example.com");
11 голосов
/ 17 января 2016

Спасибо Android за разрушение моего воскресенья. , , Вот что исправило мои приложения (после того, как вы запустили веб-просмотр)

if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ) {

  CookieManager cookieManager = CookieManager.getInstance();

  cookieManager.setAcceptThirdPartyCookies( webView, true );

}

Я должен сказать, что приведенные выше ответы, вероятно, сработают, но в моей ситуации, когда Android вышел v5 +, мой Android 'javascript' apps 'перестал работать с Android.

8 голосов
/ 18 апреля 2011

решение состоит в том, чтобы дать Android достаточно времени для обработки файлов cookie. Вы можете найти больше информации здесь: http://code.walletapp.net/post/46414301269/passing-cookie-to-webview

3 голосов
/ 23 января 2010

Большую половину 3 часа я потратил на работу над очень похожей проблемой. В моем случае у меня было несколько звонков, которые я сделал в веб-сервис с использованием DefaulHttpClient, а затем я хотел установить сеанс и все другие соответствующие куки в моем WebView.

Я не знаю, решит ли это вашу проблему, так как я не знаю, что делает ваш getCookie() метод, но в моем случае мне действительно пришлось вызвать.

cookieManager.removeSessionCookie();

Сначала удалите cookie сеанса, а затем добавьте его снова. Я обнаружил, что когда я пытался установить файл cookie JSESSIONID без предварительного его удаления, значение, которое я хотел установить, не сохранялось. Не уверен, поможет ли это вам в конкретном случае, но подумал, что поделюсь тем, что нашел.

3 голосов
/ 31 октября 2009

Я бы сохранил этот сеансовый файл cookie в качестве предпочтения и принудительно заполнил бы им менеджер файлов cookie. Звучит, что сессионный cookie не сохранился. Перезапуск активности

2 голосов
/ 24 августа 2015

Мой рабочий код

public View onCreateView(...){
    mWebView = (WebView) view.findViewById(R.id.webview);

    WebSettings webSettings = mWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);

        ...
        ...
        ...

    CookieSyncManager.createInstance(mWebView.getContext());
    CookieManager cookieManager = CookieManager.getInstance();
    cookieManager.setAcceptCookie(true);
    //cookieManager.removeSessionCookie(); // remove
    cookieManager.removeAllCookie(); //remove
    // Recommended "hack" with a delay between the removal and the installation of "Cookies"
    SystemClock.sleep(1000);

    cookieManager.setCookie("https://my.app.site.com/", "cookiename=" + value + "; path=/registration" + "; secure"); // ;
    CookieSyncManager.getInstance().sync();

    mWebView.loadUrl(sp.getString("url", "") + end_url);

    return view;
}

Чтобы отладить запрос, "cookieManager.setCookie (....);" Я рекомендую вам просмотреть содержимое базы данных webviewCookiesChromium.db (хранится в "/data/data/my.app.webview/database"). Там вы можете увидеть правильные настройки.

Отключение "cookieManager.removeSessionCookie ();" и / или "cookieManager.removeAllCookie ();"

//cookieManager.removeSessionCookie();
// and/or
//cookieManager.removeAllCookie();"

Сравните установленное значение с теми, которые установлены браузером. Настраивайте запрос на установку куки до того, как «флаги» браузера не установятся, будут соответствовать тому, что вы решите. Я обнаружил, что запрос может быть "flags":

// You may want to add the secure flag for https:
+ "; secure"
// In case you wish to convert session cookies to have an expiration:
+ "; expires=Thu, 01-Jan-2037 00:00:10 GMT"
// These flags I found in the database:
+ "; path=/registration"
+ "; domain=my.app.site.com"
1 голос
/ 07 ноября 2014

Обнаружил это тоже тоже. Вот что я сделал.

В моей учетной записи LoginActivity, внутри AsyncTask, у меня есть следующее:

CookieStoreHelper.cookieStore = new BasicCookieStore();
BasicHttpContext localContext = new BasicHttpContext();
localContext.setAttribute(ClientContext.COOKIE_STORE, CookieStoreHelper.cookieStore);

HttpResponse postResponse = client.execute(httpPost,localContext);
CookieStoreHelper.sessionCookie = CookieStoreHelper.cookieStore.getCookies();

// WHERE CookieStoreHelper.sessionCookie - это другой класс, содержащий переменную sessionCookie, определенную как List cookies; и cookieStore определяют как BasicCookieStore cookieStore;

Затем в моем фрагменте, где находится мой WebView, у меня есть следующее:

//DECLARE LIST OF COOKIE
List<Cookie> sessionCookie;

внутри моего метода или непосредственно перед настройкой WebViewClient ()

WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);

sessionCookie = CookieStoreHelper.cookieStore.getCookies();
CookieSyncManager.createInstance(webView.getContext());
CookieSyncManager.getInstance().startSync();
CookieManager cookieManager = CookieManager.getInstance();
CookieManager.getInstance().setAcceptCookie(true);
if (sessionCookie != null) {
   for(Cookie c:  sessionCookie){
      cookieManager.setCookie(CookieStoreHelper.DOMAIN, c.getName() + "=" + c.getValue());
   }
   CookieSyncManager.getInstance().sync();

 }

 webView.setWebViewClient(new WebViewClient() {
    //AND SO ON, YOUR CODE
 }

Быстрый совет: установите firebug на firefox или используйте консоль разработчика на chrome и протестируйте сначала свою веб-страницу, захватите Cookie и проверьте домен, чтобы вы могли его где-то сохранить и убедиться, что вы правильно настраиваете правильный домен.

Редактировать: отредактировано CookieStoreHelper.cookies в CookieStoreHelper.sessionCookie

1 голос
/ 18 октября 2013

Я волшебным образом решил все свои проблемы с файлами cookie с помощью одной строки в onCreate:

CookieHandler.setDefault(new CookieManager());

edit: сегодня перестал работать. :( что за хрень, андроид.

1 голос
/ 06 августа 2013

Это рабочий бит кода.

    private void setCookie(DefaultHttpClient httpClient, String url) {
    List<Cookie> cookies = httpClient.getCookieStore().getCookies();
    if (cookies != null) {
        CookieSyncManager.createInstance(context);
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);

        for (int i = 0; i < cookies.size(); i++) {
            Cookie cookie = cookies.get(i);
            String cookieString = cookie.getName() + "=" + cookie.getValue();
            cookieManager.setCookie(url, cookieString);
        }
        CookieSyncManager.getInstance().sync();
    }
}

Здесь httpclient - это объект DefaultHttpClient, который вы использовали в запросе HttpGet / HttpPost. Также необходимо убедиться в том, что имя и значение куки-файла должны быть указаны

String cookieString = cookie.getName() + "=" + cookie.getValue();

setCookie будет устанавливать cookie для данного URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...