### 简介 ###
Https双向认证主要是为了保证信息安全,组件需要保证能够支持https双向认证。
需要将核心库依赖版本更新为
```
compile 'com.tenma.ventures:tm_core:1.1.48'
```
主要方法:
```
SSLHelper.needSSL 判断是否需要双向认证。
```
```
SSLSocketFactory getSSLSocketFactory(Context context) 获取SSL证书,当不需要双向认证时,返回null。
```
```
Map<String, String> getEncryptHeaderNew(); 返回加密的随机字符串与时间戳,需要将该部分添加到https请求的头部中。(所有请求都必须添加)
```
### 使用方法 ###
使用https协议请求接口
```
OkHttpClient.Builder clientBuilder = new OkHttpClient().newBuilder();
if (SSLHelper.needSSL) {
clientBuilder.sslSocketFactory(SSLHelper.getSSLSocketFactory(getApplicationContext()));
clientBuilder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
}
OkHttpClient client = clientBuilder.build();
Request.Builder builder = new Request.Builder().url(url);
TMEncryptBean tmEncryptBean = new TMEncryptBeanNew();
//添加头部
Map<String, String> encryptHeader = tmEncryptBean.getEncryptHeader();
Set<String> keys = encryptHeader.keySet();
for (String key : keys) {
builder.addHeader(key, encryptHeader.get(key));
}
FormBody formBody = new FormBody.Builder().add("code", "1234").build();
builder.post(formBody);
//生成请求
Request request = builder.build();
...
```
使用https协议获取图片:
若组件使用Glide来加载图片,无需做特殊处理,框架已经处理,若使用其他图片库加载,则需要添加认证,具体不同框架实现各不相同,主要调用getSSLSocketFactory方法获取认证信息。
加载Web页面:
需要重写WebViewClient的shouldInterceptRequest方法,若使用框架自带的TMWebActivity或TMWebFragment则无需修改,若使用其他webview加载页面,则需要修改。修改样例代码如下
```
public class DemoWebviewClient extends WebViewClient {
@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
if (SSLHelper.needSSL) {
try {
URL url = new URL(request.getUrl().toString());
HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
urlConnection.setSSLSocketFactory(SSLHelper.getSSLSocketFactory(view.getContext()));
urlConnection.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
InputStream is = urlConnection.getInputStream();
String contentType = urlConnection.getContentType();
String encoding = urlConnection.getContentEncoding();
if (contentType != null) {
String mimeType = contentType;
if (contentType.contains(";")) {
mimeType = contentType.split(";")[0].trim();
}
return new WebResourceResponse(mimeType, encoding, is);
}
} catch (Exception e) {
e.printStackTrace();
}
}
return super.shouldInterceptRequest(view, request);
}
}
```