Подтвердить что ты не робот

WebView.loadUrl(url, headers) не работает в android

Я устанавливаю cookie в заголовках и вызываю WebView.loadUrl() с этим заголовком, но он (Cookie в заголовке) не будет работать на любом устройстве Android, кроме 4.4. Я тестировал его на версиях Android 4.2, 4.3, 4.4, 5.0 и 5.1.

webView = (WebView) findViewById(R.id.web_view);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setDisplayZoomControls(false);


HashMap <String, String> extraHeaders = new HashMap<String, String>();
extraHeaders.put("Cookie", "{cookie value}");


webView.setWebViewClient(new WebViewClient() {
    public boolean shouldOverrideUrlLoading(WebView view, String url){
            view.loadUrl(url, extraHeaders);
                return false;
        }
});

webView.loadUrl(url, extraHeaders);
4b9b3361

Ответ 1

Я получил решение проблемы, создав пользовательский менеджер файлов cookie:

public class WebkitCookieManagerProxy extends CookieManager {
    private android.webkit.CookieManager webkitCookieManager;
    public WebkitCookieManagerProxy() {
        this(null, null);
    }
    public WebkitCookieManagerProxy(CookieStore store, CookiePolicy cookiePolicy) {
        super(null, cookiePolicy);
        this.webkitCookieManager = android.webkit.CookieManager.getInstance();
    }
    @Override
    public void put(URI uri, Map<String, List<String>> responseHeaders) throws IOException {
        // make sure our args are valid
        if ((uri == null) || (responseHeaders == null)) return;
        // save our url once
        String url = uri.toString();
        // go over the headers
        for (String headerKey : responseHeaders.keySet()) {
            // ignore headers which aren't cookie related
            if ((headerKey == null) || !(headerKey.equalsIgnoreCase("Set-Cookie2") || headerKey.equalsIgnoreCase("Set-Cookie"))) continue;
            // process each of the headers
            for (String headerValue : responseHeaders.get(headerKey)) {
                this.webkitCookieManager.setCookie(url, headerValue);
            }
        }
    }
    @Override
    public Map<String, List<String>> get(URI uri, Map<String, List<String>> requestHeaders) throws IOException {
        // make sure our args are valid
        if ((uri == null) || (requestHeaders == null)) throw new IllegalArgumentException("Argument is null");
        // save our url once
        String url = uri.toString();
        // prepare our response
        Map<String, List<String>> res = new java.util.HashMap<String, List<String>>();
        // get the cookie
        String cookie = this.webkitCookieManager.getCookie(url);
        if (cookie != null) res.put("Cookie", Arrays.asList(cookie));
        return res;
    }
    @Override
    public CookieStore getCookieStore() {
        // we don't want anyone to work with this cookie store directly
        throw new UnsupportedOperationException();
    }
}

И инициализируйте пользовательский менеджер файлов cookie в классе Application или когда приложение запускается как:

android.webkit.CookieSyncManager.createInstance(this);
android.webkit.CookieManager.getInstance().setAcceptCookie(true);
WebkitCookieManagerProxy coreCookieManager = new WebkitCookieManagerProxy(null, java.net.CookiePolicy.ACCEPT_ALL);
java.net.CookieHandler.setDefault(coreCookieManager);

Ответ 2

если вы используете Android Lollipop, тогда

CookieManager.getInstance().setAcceptCookie(true);

не будет работать. Вы должны использовать

CookieManager.getInstance().setAcceptThirdPartyCookies(true);

Ответ 3

Вы пробовали это

   CookieManager.getInstance().setAcceptCookie(true);

Ответ 4

Чтобы установить cookie, используйте следующий метод

CookieManager.getInstance().setCookie(BuildConfig.BASE_SERVER_ENDPOINT,COOKIE_VAL);

Убедитесь, что конечная точка базы соответствует базовому URL-адресу ссылок, открытых в веб-просмотре.

Удаление файла cookie

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                CookieManager.getInstance().removeAllCookies(null);
            } else {
                CookieManager.getInstance().removeAllCookie();
            }

Ответ 5

Из политики Cookie, чтобы исправить это, вы должны добавить следующее:

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    super.init();

    // Allow third party cookies for Android Lollipop
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        WebView webView = (WebView)super.appView;
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptThirdPartyCookies(webView,true);
    }

    super.loadUrl(Config.getStartUrl());
}

Ответ 6

Это просто быстрый пост о добавлении файлов cookie в веб-представление. Если вы когда-либо пытались сделать так, как большинство людей сказали, что это должно быть сделано, вы потерпели неудачу и нашли этот пост.:)

Способ, которым он должен работать, - установить cookie в CookieManager, а затем сообщить cookieSyncManager для синхронизации.

CookieManager.getInstance().setCookie(domain, value);
CookieSyncManager.getInstance().sync();

У меня никогда не было этого, как описано. С или без задач async, ожидающих, пока потоки будут догнаны.

Вместо этого я просто добавляю cookie в заголовок всех вызовов loadUrl.

Map<String, String> headers = new HashMap<String, String>();
headers.put("Cookie", "cookieName=cookieValue;domain=domain.com;path=/;Expires=Thu, 2 Aug 2021 20:47:11 UTC;");
webView.loadUrl("myurl.com", headers );

Предостережение: мне нужно только сначала загрузить соответствующий файл cookie для запроса, если вы хотите покрыть вложенные вызовы внутри браузера, вам нужно переопределить shouldOverrideUrlLoading.

webView.setWebViewClient(new WebViewClient() {
     @Override
     public boolean shouldOverrideUrlLoading(WebView view, String url) {
         view.loadUrl(url, headers);
         return false;
     }
});

Если вам нужно вставить файл cookie для всех запросов (включая изображения, js и т.д.), вам нужно будет переопределить shouldInterceptRequest,

Ответ 7

Если вы используете Android Lollipop i.e SDK 21, то:

CookieManager.getInstance().setAcceptCookie(true);

не будет работать. Вам необходимо использовать:

CookieManager.getInstance().setAcceptThirdPartyCookies(true);

Я столкнулся с той же проблемой, и вышеприведенная строка работала как прелесть.