我正在尝试找到一种正确的方法来处理 Android Webview 中的 SSL 证书错误。我的目标是提供一种加载带有 SSL 证书错误的页面的方法,但让用户在尝试加载带有证书错误的 URL 时警告他安全性后选择加载页面。
我在线程中找到的最接近的解决方案建议覆盖 WebViewClient 如下:
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(final WebView view, final SslErrorHandler handler, final SslError error) {
handler.proceed();
}
});
但是,这基本上会在未经用户同意的情况下禁用 WebView 中的 SSL。
以下是我找到该解决方案的线程供参考:
在 Android 中使用 WIFI 时,Web 视图在加载 URL 后显示空白/白页
Android WebView 阻止从 https 重定向到 http
我继续实施了一个稍微不同的版本,它会提示用户:
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(final WebView view, final SslErrorHandler handler, final SslError error) {
//Showing a first confirmation dialog
AndroidUtils.showYesNoDialog(
//First confirmation message
"WARNING - THIS PAGE IS NOT SECURE! Are you sure you want to continue loading it?",
//First confirmation "YES" option runnable
new Runnable() {
@Override
public void run() {
//Showing a second confirmation dialog
AndroidUtils.showYesNoDialogWithResId(
//Second confirmation message
"You chose to load an unsecure page, are you sure you want to do that?",
//Second confirmation "YES" option runnable
new Runnable() {
@Override
public void run() {
//Disregard the error and proceed with the bad certificate anyways
handler.proceed();
}
},
//Second confirmation "NO" option runnable
new Runnable() {
@Override
public void run() {
//Cancel loading the page with that certificate error
handler.cancel();
}
}
);
}
},
//First confirmation "NO" option runnable
new Runnable() {
@Override
public void run() {
//Cancel loading the page with that certificate error
handler.cancel();
}
});
}
});
该实现询问用户两次是否要加载页面,如果他两次回答是,则忽略错误并加载页面,否则取消页面加载。
第一次加载带有证书错误的 URL 时,WebViewClient.onReceivedSslError
会被调用,但是如果用户继续遇到证书错误并被SslErrorHandler.proceed()
调用,则以下次数相同的 URL 将WebViewClient.onReceivedSslError
永远不会被再次调用:仅终止应用程序会重置此行为。
我希望WebViewClient.onReceivedSslError
在加载带有证书错误的 URL 时被系统地调用,而不仅仅是第一次。我尝试调用这些方法但没有成功:
/** JAVADOC QUOTE: Clears the SSL preferences table stored in response to proceeding with SSL certificate errors.*/
webView.clearSslPreferences();
//Those other methods I tried out of despair just in case
webView.clearFormData();
webView.clearCache(true);
webView.clearHistory();
webView.clearMatches();
有人知道如何在调用WebViewClient.onReceivedSslError
同一个 URL 后SslErrorHandler.proceed()
多次调用 WebView 吗?