热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

我的Volley+OkHttp实现Https

在参考了Android网络–我是怎么做的:Volley+OkHttp+Https之后,我总结了下,实现了自己的网络请求框架先上框架图:网络请求框架模块这里主要说下OkHttpSta

在参考了Android 网络–我是怎么做的: Volley+OkHttp+Https 之后,我总结了下,实现了自己的网络请求框架

先上框架图:

《我的Volley+OkHttp实现Https》 网络请求框架模块

这里主要说下OkHttpStack.java这个类,因为我是通过修改它来实现的Https
话不多说,直接上代码:

/**
* Created by caihan on 2016/9/14.
*/
public class OkHttpStack extends HurlStack {
private static final String TAG = "OkHttpStack";
private OkHttpClient okHttpClient;
private boolean useClientAuth = false;
// private static String mHttpsHost = "kyfw.12306.cn";
// private static int mRes = R.raw.kyfw;
// private static String mPassWord = "asdfqaz";
public OkHttpStack() {
this(new OkHttpClient());
}
public OkHttpStack(OkHttpClient okHttpClient) {
this.okHttpClient = okHttpClient;
}
@Override
protected HttpURLConnection createConnection(URL url) throws IOException {
if ("https".equals(url.getProtocol())) {
HttpsURLConnection cOnnection= (HttpsURLConnection) new OkUrlFactory(okHttpClient).open(url);
try {
connection.setSSLSocketFactory(createSSLSocketFactory(AppData.getContext(), -1, null));
} catch (CertificateException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
return connection;
} else {
return new OkUrlFactory(okHttpClient).open(url);
}
}
private SSLSocketFactory createSSLSocketFactory(Context context, int res, String password)
throws CertificateException,
NoSuchAlgorithmException,
IOException,
KeyStoreException,
KeyManagementException {
KeyManager[] kms = null;
TrustManagerFactory tmf = null;
// 实例化SSL上下文
SSLContext sslCOntext= SSLContext.getInstance("TLS");
if (res > 0 && !TextUtils.isEmpty(password)) {
InputStream inputStream = context.getResources().openRawResource(res);
// 获得信任库
KeyStore keyStore = KeyStore.getInstance("BKS");
keyStore.load(inputStream, password.toCharArray());
// 实例化信任库
tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
// 初始化信任库
tmf.init(keyStore);
if (useClientAuth) {
try {
String KEYSTORE_PASSWORD = "pass";
// 获得密钥库
KeyStore keyStoreM = KeyStore.getInstance("PKCS12");//JKS
keyStoreM.load(inputStream, KEYSTORE_PASSWORD.toCharArray());
// 实例化密钥库
KeyManagerFactory kmf = KeyManagerFactory
.getInstance(KeyManagerFactory.getDefaultAlgorithm());
// 初始化密钥工厂
kmf.init(keyStoreM, KEYSTORE_PASSWORD.toCharArray());
kms = kmf.getKeyManagers();
} catch (UnrecoverableKeyException e) {
e.getMessage();
}
}
// 初始化SSL上下文
sslContext.init(kms, tmf.getTrustManagers(), new SecureRandom());
} else {
TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[]{};
}
public void checkClientTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
}};
sslContext.init(null, trustAllCerts, new SecureRandom());
}
return sslContext.getSocketFactory();
}
/**
* 在getInstance在Application中,若需要是用https,需要先调用此方法
* 并且部分参数、方法、协议等可能需要改动
*
* @param httpsHost
* @param res
* @param password
*/
public static void prepareHttps(String httpsHost, int res, String password) {
// mHttpsHost = httpsHost;
// mRes = res;
// password = mPassWord;
}
}

推荐阅读
  • Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+Loope ... [详细]
  • Java设计模式详解:解释器模式的应用与实现
    本文详细介绍了Java设计模式中的解释器模式,包括其定义、应用场景、优缺点以及具体的实现示例。通过音乐解释器的例子,帮助读者更好地理解和应用这一模式。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 可参照github代码:https:github.comrabbitmqrabbitmq-tutorialsblobmasterjavaEmitLogTopic.ja ... [详细]
  • PBO(PixelBufferObject),将像素数据存储在显存中。优点:1、快速的像素数据传递,它采用了一种叫DMA(DirectM ... [详细]
  • 稀疏数组是一种用于存储和处理大部分元素为零或相同值的数组的技术。通过记录非零元素的位置和值,稀疏数组可以显著减少存储空间和提高处理效率。 ... [详细]
  • 本文介绍了如何在 Spring Boot 项目中使用 spring-boot-starter-quartz 组件实现定时任务,并将 cron 表达式存储在数据库中,以便动态调整任务执行频率。 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • 我有一个从C项目编译的.o文件,该文件引用了名为init_static_pool ... [详细]
  • JVM钩子函数的应用场景详解
    本文详细介绍了JVM钩子函数的多种应用场景,包括正常关闭、异常关闭和强制关闭。通过具体示例和代码演示,帮助读者更好地理解和应用这一机制。适合对Java编程和JVM有一定基础的开发者阅读。 ... [详细]
  • Android 自定义 RecycleView 左滑上下分层示例代码
    为了满足项目需求,需要在多个场景中实现左滑删除功能,并且后续可能在列表项中增加其他功能。虽然网络上有很多左滑删除的示例,但大多数封装不够完善。因此,我们尝试自己封装一个更加灵活和通用的解决方案。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • 如何使用 `org.eclipse.rdf4j.query.impl.MapBindingSet.getValue()` 方法及其代码示例详解 ... [详细]
author-avatar
-依小冷_217
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有