Android接入HTTPS

  • ~3.56K 字

项目升级HTTPS后不光是接口需要针对处理,webView也需要同步处理,最后还有一些第三方库。

  1. 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的话就不行了。

  1. 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
// 解决glide加载https证书问题
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
/**
* 设置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();
}

需要注意的是导包不要导错了

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;
赞助喵
非常感谢您的喜欢!
赞助喵
分享这一刻
让朋友们也来瞅瞅!