Android WebView清除基本身份验证凭据

时间:2013-03-28 20:36:50

标签: android caching webview basic-authentication webviewclient

我已经制作了一个使用基本身份验证对服务器进行身份验证的应用。但是我无法清除凭据,因此这意味着我有两个未解决的问题:

  • 用户无法在不退出程序的情况下退出
  • 如果用户输入凭据错误,则必须退出并重新输入程序

我尝试了很多我自己的不同实现,很多人都推荐在这个网站上。我在freenode上安排了#android-dev无济于事。所以这是我的最后一个选择。

这是我的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);

只有我第一次运行它才会运行onReceivedHttpAuthRequest。如果我注销并重新登录,它将运行onPageStarted,然后使用以前的凭据onPageFinished。因此,如果我退出并输入新用户,我将重新登录原始用户。或者,如果我输入错误的用户名和密码,它将挂在OnPageStarted上。我已经尝试过使用onReceivedError和http错误,但没有任何好处。

以下是我尝试使用logout()方法实现deauth的一些代码,以及代码的其他部分。我也尝试了很多不同的变体:

    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 - Completely Clear the Cache

2 个答案:

答案 0 :(得分:1)

试试这个:

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

我在VKontakte登录活动中使用此功能清除webview中保存的用户名/密码。

答案 1 :(得分:0)

@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
    }