前言:只要涉及到https,大家都会第一时间想到证书验证。当然,这是没问题的。如果有要求,这个证书验证是必须的。一般情况下,都是需要证书的(有证书毕竟安全些吗)
正常的解决办法:
重写类WebViewClient
第一种方法:
webView.setWebViewClient(new WebViewClient ()
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
super.onReceivedSslError(view, handler, error);
}
});
说明:Android WebView组件加载网页发生证书认证错误时,会调用WebViewClient类的onReceivedSslError方法,在这个方法里,我们可以点击源码看到SslErrorHandler中有两个主要的方法可以调用
【1】cancel( )
停止加载问题页面
【2】proceed( )
忽略SSL证书错误,继续加载页面
如果我们不考虑证书安全,则可以直接这样写
webView.setWebViewClient(new WebViewClient ()
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();
}
});
当然了,既然用到了https,我们大部分时候都是为了网络安全问题
所以,可以定义一个类来验证证书安全,代码如下:
/**
* 时间 :2018/1/11 10:17
* 作者 :陈奇
* 作用 :证书验证的方法
*/
public class CertifiUtils {
// 验证证书
public static void OnCertificateOfVerification(final SslErrorHandler handler, String url) {
OkHttpClient.Builder builder = setCertificates(new OkHttpClient.Builder());
Request request = new Request.Builder().url(url)
.build();
builder.build().newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
BNLog.e("证书验证失败", e.getMessage());
handler.cancel();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
BNLog.e("证书验证成功", response.body().string());
handler.proceed();
}
});