项目升级HTTPS后不光是接口需要针对处理,webView也需要同步处理,最后还有一些第三方库。
- WebView
这里我们选择简单的忽略方式,即所有的https请求都放行。
重载WebViewClient的onReceivedSslError方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| webView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; }
@Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ view.loadUrl(request.getUrl().toString()); return true; } return false; }
@Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); } });
|
直接使用handler.proceed();表明不处理SSL警告,这样虽然简单 ,但是会存在一定的风险,另外如果要上架google play的话就不行了。
- Glide
作为图片加载框架,自然也是有网络能力的,我项目里的Glide是升级到4.11.0的
1 2
| implementation "com.github.bumptech.glide:glide:4.11.0" annotationProcessor "com.github.bumptech.glide:compiler:4.11.0"
|
如果你需要处理HTTPS的图片,我们需要接入Glide提供的okhttp
1
| implementation 'com.github.bumptech.glide:okhttp3-integration:4.11.0'
|
在你自己的Application中,初始化的时候全局修改
1 2 3 4 5 6 7 8
| try { Glide.get(this).getRegistry().replace( GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(getSSLOkHttpClient())); } catch (Exception e) { e.printStackTrace(); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
private OkHttpClient getSSLOkHttpClient() throws Exception { final X509TrustManager trustManager = new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } };
SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, new TrustManager[]{trustManager}, new SecureRandom()); SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
return new OkHttpClient.Builder() .sslSocketFactory(sslSocketFactory, trustManager) .hostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } }) .build(); }
|
需要注意的是导包不要导错了
1 2 3 4 5 6 7 8 9 10 11
| import java.security.SecureRandom; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import okhttp3.OkHttpClient; import com.bumptech.glide.integration.okhttp3.OkHttpUrlLoader;
|