一开始工作做项目的时候,在小公司,都是使用http协议进行开发,后来来了大公司之后,发现他们用的https协议,但是Android使用https协议一般需要配置证书,经探索发现可以忽略https证书进行开发,与之不同的是iOS内置了很多信任的证书,所以iOS不需要做任何操作。
以下代码在项目里,项目地址:https://gitee.com/urasaki/RxJava2AndRetrofit2
1.新建一个类SSLSocketManager。
package com.phone.common_library.manager;
import java.security.SecureRandom;
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;
/**
* okhttp3忽略https证书
*/
public class SSLSocketManager {
/**
* 获取这个SSLSocketFactory
*
* @return
*/
public static SSLSocketFactory getSSLSocketFactory() {
try {
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, getTrustManager(), new SecureRandom());
return sslContext.getSocketFactory();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 获取trustManager
*
* @return
*/
public static TrustManager[] getTrustManager() {
TrustManager[] trustManager = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[]{};
}
}
};
return trustManager;
}
/**
* 获取hostnameVerifier
*
* @return
*/
public static HostnameVerifier getHostnameVerifier() {
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(String s, SSLSession sslSession) {
return true;
}
};
return hostnameVerifier;
}
}
2.通过这个类我们可以获得SSLSocketFactory,这个东西就是用来管理证书和信任证书的,然后还需要配置一个HostnameVerifier来忽略host验证,然后我们在Okhttp3中设置一下这两个属性。
//创建OkHttpClient对象
client = new OkHttpClient.Builder()
.connectTimeout(5000, TimeUnit.MILLISECONDS) //连接超时
.readTimeout(5000, TimeUnit.MILLISECONDS) //读取超时
.writeTimeout(5000, TimeUnit.MILLISECONDS) //写入超时
.addInterceptor(new AddAccessTokenInterceptor(BaseApplication.getInstance())) //拦截器用于设置header
.addInterceptor(new ReceivedAccessTokenInterceptor(BaseApplication.getInstance())) //拦截器用于接收并持久化cookie
.sslSocketFactory(SSLSocketManager.getSSLSocketFactory())//配置
.hostnameVerifier(SSLSocketManager.getHostnameVerifier())//配置
// .proxy(Proxy.NO_PROXY)
.build();
然后就可以正常使用了。
如果你使用的Retrofit2.0及其以上版本,可以把OkHttpClient对象设置到Retrofit2里。
// 初始化Retrofit
retrofit = new Retrofit.Builder()
.client(client)
.baseUrl(ConstantUrl.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
如对此有疑问,请联系qq1164688204。
推荐Android开源项目
项目功能介绍:原本是RxJava2 和Retrofit2 项目,现已更新使用Kotlin+RxJava2+Retrofit2+MVP架构+组件化和
Kotlin+Retrofit2+协程+MVVM架构+组件化, 添加自动管理token 功能,添加RxJava2 生命周期管理,集成极光推送、阿里云Oss对象存储和高德地图定位功能。
项目地址:https://gitee.com/urasaki/RxJava2AndRetrofit2