项目升级 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;