Android WebView очистить учетные данные базовой аутентификации

Я сделал приложение, которое аутентифицируется на сервере, используя обычную аутентификацию. Однако я не могу очистить учетные данные, так что это означает, что у меня есть две нерешенные проблемы:

  • Пользователь не может выйти без выхода из программы
  • Если пользователь вводит неверные учетные данные, он должен выйти и повторно войти в программу

Я испробовал множество различных собственных реализаций, и многие рекомендовали на этом сайте. Я разбил лагерь # android-dev на freenode безрезультатно. Так что это мой последний вариант.

Вот мой пример кода для WebView (я вынул некоторые вещи, но основной код по сути тот же):

    wv = new WebView(getBaseContext());
    wv.setWebViewClient(new WebViewClient() {
        boolean error = false;
        int count = 0;
        int checked = 0;

        @Override
        public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
            count++;
            if (count >= 3) {
                Toast.makeText(getBaseContext(), "Login Failed. Please Try Again.", Toast.LENGTH_LONG).show();

            } else {
                handler.proceed(getUser(), getPass());
            }// end else
        }// end onReceivedHttpAuthRequest


        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {

        }// onPageStarted

        // on success switch activities
        @Override
        public void onPageFinished(WebView view, String url) {

            if (view.getTitle().equalsIgnoreCase("fooTitle")) {

                // switch activities
                Intent fooActivity = new Intent(getBaseContext(), fooActivity.class);
                startActivity(fooActivity);
            } else {
                //failed
            }// end else
        }// end onPageFinished
    });// end setWebViewCleint

    wv.getSettings().setJavaScriptEnabled(true);
    wv.loadUrl(url);

Только при первом запуске он запускается по ReceivedHttpAuthRequest. Если я выйду из системы и снова войду в нее, она будет запущена onPageStarted, а затем onPageFinished с предыдущими учетными данными. Поэтому, если я выйду из системы и войду в нового пользователя, я снова войду в систему с исходным пользователем. Или, если я введу неправильное имя пользователя и пароль, он просто зависнет на OnPageStarted. Я попытался использовать onReceivedError и ошибку http, а также безрезультатно.

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

    wv.clearCache(true);
    wv.setHttpAuthUsernamePassword(host, realm, "","");
    clearCacheFolder(this.getCacheDir());
    clearCacheFolder(this.getExternalCacheDir());
    this.getBaseContext().deleteDatabase("webview.db");
    this.getBaseContext().deleteDatabase("webviewCache.db");
    WebViewDatabase.getInstance(getBaseContext()).clearHttpAuthUsernamePassword();
    WebViewDatabase.getInstance(getBaseContext()).clearUsernamePassword();
    WebViewDatabase.getInstance(getBaseContext()).clearFormData();
    WebStorage.getInstance().deleteAllData();
    wv.setHttpAuthUsernamePassword(host, realm,
    username, password);

ClearCacheFolder ссылается на метод markjan, размещенный здесь: Android Webview - полностью очистить кэш

2 ответа

Попробуй это:

    CookieSyncManager.createInstance(this);
    CookieManager cookieManager = CookieManager.getInstance();
    cookieManager.removeAllCookie();

Я использовал это в VKontakte Login Activity, чтобы очистить сохраненное имя пользователя / пароль в веб-просмотре.

@Override
public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
    count++;
    if (count >= 3) {
    handler.cancel();// after adding this line of code my
                     //problem is solved. Hope it will for you too.

    Toast.makeText(getBaseContext(), "Login Failed. Please Try Again.", Toast.LENGTH_LONG).show();

    } else {
        handler.proceed(getUser(), getPass());
        }// end else
    }
Другие вопросы по тегам