使用OkhttpUtils作为网络框架同时,使用Glide加载Https图片

前言

公司的后台公网之前的ca认证过期了,然后发现app中部分图片加载不出来
然后对于数据来源进行分析,发现展示不出来的是https的图片
网络框架使用的是鸿洋的OkhttpUtils 2.6.3版本,进行了二次封装
图片框架使用的是Glide
OkhttpUtils有对于https证书的设置讲解
这里主要提供下自己遇到的情况下的解决方案
这里的解决方案适用于自定义证书和信任所有证书

过程

网上有Glide加载Https图片的方案
大家可以随便搜索
大概的意思就是添加一个GlideModule来进行网络请求库的定制
需要添加GlideModule的依赖
我们也添加一下

compile 'com.github.bumptech.glide:okhttp-integration:1.4.0@aar'

然后需要在application中进行初始化

//让Glide能用HTTPS
Glide.get(this).register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(RetrofitUtils.getOkHttpClient()));

我们可以发现RetrofitUtils.getOkHttpClient()是我们所没有的
大概的意思就是需要一个网络加载框架cilent来进行代理Glide的网络加载部分

再来看下鸿洋的OkhttpUtils 2.6.3版本源码

public class OkHttpClient implements Cloneable, Call.Factory {

可以发现,其集成了Call.Factory接口
这正是配置Glide时需要的

      public Factory(Call.Factory client) {

直接将设置好的OkhttpUtils的Cilent填充进来

     Glide
     .get(this)
     .register(GlideUrl.class, 
                 InputStream.class, 
                 new OkHttpUrlLoader.Factory(OkHttpUtils.getInstance().getOkHttpClient()));

最后 我们再在之前自己的框架中设置添加证书或者 https信任

     .sslSocketFactory(createSSLSocketFactory())
       .hostnameVerifier(new TrustAllHostnameVerifier())
    private static SSLSocketFactory createSSLSocketFactory() {
        SSLSocketFactory ssfFactory = null;

        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, new TrustManager[]{new TrustAllCerts()}, new SecureRandom());

            ssfFactory = sc.getSocketFactory();
        } catch (Exception e) {
        }
        return ssfFactory;
    }
    private static class TrustAllHostnameVerifier implements HostnameVerifier {
        @Override
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    }

    private static class TrustAllCerts implements 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];
        }
    }

我这里是信任所有证书,对于添加证书的例子,百度就可以找到了
只是把设置证书的地方替换了就可以了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章