Как установить cookie в клиенте Android WebView

Я хочу вызвать один конкретный URL-адрес через WebView. Страница может быть вызвана только после того, как пользователь уже вошел в систему. Я использую библиотеку AsyncHttpClient для выполнения вызова входа. После успешного входа в систему загрузка URL-адреса через WebView, похоже, не распознает правильные заголовки, например cookie. Я подозреваю, что файлы cookie неправильно синхронизируются между HttpClient и WebView's HttpClient. Есть идеи, почему? . Вот как я использую WebView

    final WebView webView = (WebView) content.findViewById(R.id.web_travel_advisory);
    String url = "http://mydomainurl.com/get_data_after_login";

    webView.setWebViewClient(new WebViewClient());

    CookieSyncManager.createInstance(getActivity());
    CookieSyncManager.getInstance().startSync();
    CookieManager.getInstance().setAcceptCookie(true);

    webView.getSettings().setJavaScriptEnabled(true);

    webView.loadUrl(url);

Цените вашу помощь.


person Tixeon    schedule 14.10.2015    source источник
comment
См. Также stackoverflow.com/questions/1652850/.   -  person CoolMind    schedule 18.06.2020


Ответы (3)


Ох, через несколько часов я наконец понял, что это сработало. Во-первых, CookieSyncManager в более поздних версиях Android устарел. поскольку api 21 согласно док. Поэтому решил больше не использовать. Во-вторых, CookieManager используется для хранения файлов cookie для WebView.

Окончательный код

    CookieManager cookieManager = CookieManager.getInstance();
    cookieManager.setAcceptCookie(true);

    List<Cookie> cookies = WSHelper.cookieStore.getCookies();

    cookieManager.removeAllCookie();

    if (cookies != null) {
        for (Cookie cookie : cookies) {
            if (cookie.getName().contains("session")){
                String cookieString = cookie.getName() + "=" + cookie.getValue() + "; Domain=" + cookie.getDomain();
                cookieManager.setCookie(cookie.getDomain(), cookieString);
                Log.d("CookieUrl",cookieString + " ");
            }
        }
    }
    webView.loadUrl(url);

Ключевые изменения в решении: используйте cookie.getDomain () вместо явного домена.

cookieManager.setCookie(cookie.getDomain(), cookieString);
person Tixeon    schedule 15.10.2015
comment
до голосования, поскольку вы упомянули о предоставлении имени домена cookie вместо домена сервера, который веб-просмотр собирается загрузить. это решило мою проблему - person sunil; 18.01.2017
comment
@Tixeon, не могли бы вы сказать мне, какую библиотеку мне нужно импортировать, чтобы это работало? Студия Android продолжает жаловаться на List ‹Cookie›. Кроме того, могу ли я конкретно упомянуть доменное имя? Как? Сохраняются ли файлы cookie и используются ли они повторно, если мы закрыть и снова открыть приложение? - person user1788736; 15.12.2017
comment
что такое WSHelper ?? - person Adam Kis; 01.06.2018
comment
@AdamKis Вы можете получить сохраненные файлы cookie где-нибудь еще. - person chengsam; 20.06.2018
comment
вообще бесполезен, не упоминается, почему мы не можем получить Список ‹Cookie› файлов cookie - person HiDd3N; 15.01.2021

Попробуйте этот код, после нескольких изменений у меня сработает:

public class WebViewActivity extends Activity{
    private SharedPreferences mPreferences;

    String token="";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.webviewpage);

        mPreferences = getSharedPreferences("CurrentUser", MODE_PRIVATE);

    }

    public void LaunchWebView(View view) {

        WebView myWebView = (WebView) findViewById(R.id.myWebView);
        myWebView.getSettings().setJavaScriptEnabled(true);
        myWebView.getSettings().setSaveFormData(false);

        CookieSyncManager.createInstance(this);
        CookieSyncManager.getInstance().startSync();
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);
        CookieManager.getInstance().setAcceptThirdPartyCookies(myWebView, true);

        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        String token2= mPreferences.getString("auth_token","");

        HashMap<String, String> map = new HashMap<String, String>();
        map.put("x-auth-token", token);

        myWebView.getSettings().setAppCacheEnabled(true);
        myWebView.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view,String url) {
                view.loadUrl(url);
                return true;
            }
        });
        myWebView.loadUrl("YOUR_URL", map);
    }
}
person Alexiscanny    schedule 05.11.2015

Моя проблема была немного другой, но ответ от @Tixeon дал мне ключ к ее решению. Я составлял свой файл cookie и добавлял его в запрос WebView, но обнаружил, что Android переопределяет мой файл cookie и отправляет свой собственный файл cookie. Итак, сначала мне пришлось удалить все файлы cookie из массива, а затем создать свой собственный файл cookie. Это пример кода:

// Note that my project has minSdkVersion 21, so I can directly use methods only available in Lollipop
private fun loadUrlInWebView(url: String) {
    webView.settings.apply {
        builtInZoomControls = false
        javaScriptEnabled = true
        useWideViewPort = true
        loadWithOverviewMode = true
        setSupportMultipleWindows(false)
    }
    CookieManager.getInstance().apply {
        setAcceptThirdPartyCookies(webView, true) // My minSdkVersion is 21
        removeAllCookies { value ->
            Log.d("Cookies", "Removed all cookies from CookieManager")
        }
    }

    webView.apply {
        isVerticalScrollBarEnabled = true
        isHorizontalScrollBarEnabled = true
        loadUrl(
            url,
            mutableMapOf(
                "Cookie" to "ThisIsMyCookieWithMyValues",
                "Accept" to "*/*",
                "Accept-Encoding" to "gzip, deflate",
                "Cache-Control" to "no-cache",
                "Content-type" to "application/x-www-form-urlencoded"
            )
        )
    }
}

Теперь запрос содержит мой файл cookie, а не файл по умолчанию, предоставляемый Android, и мой сеанс в WebView работает. Надеюсь, это поможет кому-то другому

person voghDev    schedule 25.02.2019