4

基本認証を使用してサーバーで認証するアプリを作成しました。ただし、資格情報を消去できないため、未解決の問題が 2 つあります。

  • ユーザーはプログラムを終了しないとログアウトできません
  • ユーザーが資格情報を間違って入力した場合、プログラムを終了して再入力する必要があります

私は自分自身でさまざまな実装を試しましたが、その多くがこの Web サイトで推奨されています。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 エラー 1 を使用してみましたが、何のメリットもありません。

これは、 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 - 完全にキャッシュをクリアする

4

2 に答える 2

1

これを試して:

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

これを VKontakte Login Activity で使用して、保存されたユーザー名/パスワードを webview にクリアしました。

于 2013-03-28T20:39:24.033 に答える
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
    }
于 2015-03-30T10:57:59.213 に答える