我们可以通过以下代码来解决这个问题:
首先,我们要创建一个自定义的WebViewClient,并重写shouldOverrideUrlLoading方法。在这个方法里,我们先调用父类的shouldOverrideUrlLoading方法,然后再手动配置信任的证书。
//创建自定义的WebViewClient
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//调用父类的shouldOverrideUrlLoading方法
boolean result = super.shouldOverrideUrlLoading(view, url);
//手动配置信任的证书
if (url != null && url.startsWith("https://")) {
try {
URL myUrl = new URL(url);
HttpsURLConnection connection = (HttpsURLConnection)myUrl.openConnection();
if (connection instanceof HttpsURLConnection) {
try {
Certificate[] certs = connection.getServerCertificates();
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null);
for (Certificate cert : certs) {
String alias = cert instanceof X509Certificate ? ((X509Certificate)cert).getSubjectDN().getName() : myUrl.getHost();
trustStore.setCertificateEntry(alias, cert);
}
SSLContext context = SSLContext.getInstance("TLS");
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(trustStore);
context.init(null, tmf.getTrustManagers(), new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
return result;
}
}
接下来,在我们的WebView中,我们要使用这个自定义的WebViewClient。这可以通过以下代码实现:
//在WebView中使用MyWebViewClient
webView.setWebViewClient(new MyWebView
上一篇:AndroidWebview不能打开服务器端的CSS/JAVASCRIPT
下一篇:AndroidWebview出现DOMException:Theuseragentdoesnotsupportpublickeycredentials错误。