项目升级HTTPS后不光是接口需要针对处理,webView也需要同步处理,最后还有一些第三方库。
-
WebView
这里我们选择简单的忽略方式,即所有的https请求都放行。
重载WebViewClient的onReceivedSslError方法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的implementation "com.github.bumptech.glide:glide:4.11.0" annotationProcessor "com.github.bumptech.glide:compiler:4.11.0"
如果你需要处理HTTPS的图片,我们需要接入Glide提供的okhttp
implementation 'com.github.bumptech.glide:okhttp3-integration:4.11.0'
在你自己的Application中,初始化的时候全局修改
// 解决glide加载https证书问题 try { Glide.get(this).getRegistry().replace( GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(getSSLOkHttpClient())); } catch (Exception e) { e.printStackTrace(); }
/** * 设置https 访问的时候对所有证书都进行信任 * * @throws Exception */ 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(); }
需要注意的是导包不要导错了
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;