第一次写帖子,嘿嘿。

最近了解到google2013IO大会出了个网络框架,正好项目也需要用到,就看了下。

最后发现接口都是HTTPS的,但是Volley默认是不支持HTTPS,网上找了好久,都没有对Volley HTTPS请求做解答。

所以分享下心得。

bvin大神已经分析框架的帖子 在下面的传送:

谷歌Volley网络框架讲解——第一篇

谷歌Volley网络框架讲解——Network及其实现类

谷歌Volley网络框架讲解——HttpStack及其实现类

具体框架的安装及使用我是参照下面文章:

http://www.cnblogs.com/xyzlmn/p/3360485.html

 

通过前面的内容可以使大家对Volley有所了解。下面就开始讲支持HTTPS的实现。

其实Volley可以支持HTTPS,但是框架中默认没有加上去我们可以修改一小部分源码来实现这以功能。

volley的网络请求 先要通过toolbox包下的Volley.java生成一个requestQueue.在requestQueue去分发请求,处理请求是使用HttpStack接口来完成的。看下面的代码Volley.java中的newRequestQueueInDisk

  1. public static RequestQueue newRequestQueueInDisk(Context context, String dir, HttpStack stack) {
  2. File cacheDir = new File(dir, DEFAULT_CACHE_DIR);
  3. String userAgent = "volley/0";
  4. try {
  5. String packageName = context.getPackageName();
  6. PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);
  7. userAgent = packageName + "/" + info.versionCode;
  8. } catch (NameNotFoundException e) {
  9. }
  10. if (stack == null) {
  11. //2.3及以上版本使用HurlStack来处理请求
  1. if (Build.VERSION.SDK_INT >= 9) {
  2. stack = new HurlStack();
  3. } else {
  4. // Prior to Gingerbread, HttpUrlConnection was unreliable.
  5. // See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html
  6. stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
  7. }
  8. }
  9. Network network = new BasicNetwork(stack);
  10. RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);
  11. queue.start();
  12. return queue;
  13. }

我们来看下HurlStack这个类的构造大家就会发现其实volley可以支持https了,同样位于toolbox包下

  1. public HurlStack() {
  2. this(null);
  3. }
  4. /**
  5. * @param urlRewriter Rewriter to use for request URLs
  6. */
  7. public HurlStack(UrlRewriter urlRewriter) {
  8. this(urlRewriter, null);
  9. }
  10. /**
  11. * @param urlRewriter Rewriter to use for request URLs
  12. * @param sslSocketFactory SSL factory to use for HTTPS connections
  13. */
  14. public HurlStack(UrlRewriter urlRewriter, SSLSocketFactory sslSocketFactory) {
  15. mUrlRewriter = urlRewriter;
  16. mSslSocketFactory = sslSocketFactory;
  17. }
  1. private HttpURLConnection openConnection(URL url, Request<?> request) throws IOException {
  2. HttpURLConnection connection = createConnection(url);
  3. int timeoutMs = request.getTimeoutMs();
  4. connection.setConnectTimeout(timeoutMs);
  5. connection.setReadTimeout(timeoutMs);
  6. connection.setUseCaches(false);
  7. connection.setDoInput(true);
  8. <span style="color:#ff6600;"> </span>// use caller-provided custom SslSocketFactory, if any, for HTTPS
  9. if ("https".equals(url.getProtocol()) && mSslSocketFactory != null) {
  10. ((HttpsURLConnection)connection).setSSLSocketFactory(mSslSocketFactory);
  11. }
  12. return connection;
  13. }

由此可以看出HurlStack 是支持HTTPS 只是在Volley.java生成对象时调用的是无参构造。所以 SSLSocketFactory并没有实例对象。

那么一种修改的方法是重写Volley.java newRequestQueueInDisk方法 调用第三个构造。又因为这三个构造最后调用的都是参数最多的那个所以也可以在第三个构造中直接默认生成SSLSocketFactory示例。但是我没有用这种方法。

我的实现方法是在toolbox中添加HTTPSTrustManager类(代码网上找的- -、),并对HurlStack的createConnetcion方法进行了小小的修改。

  1. package com.android.volley.toolbox;
  2. import java.security.KeyManagementException;
  3. import java.security.NoSuchAlgorithmException;
  4. import java.security.SecureRandom;
  5. import java.security.cert.X509Certificate;
  6. import javax.net.ssl.HostnameVerifier;
  7. import javax.net.ssl.HttpsURLConnection;
  8. import javax.net.ssl.SSLContext;
  9. import javax.net.ssl.SSLSession;
  10. import javax.net.ssl.TrustManager;
  11. import javax.net.ssl.X509TrustManager;
  12. public class HTTPSTrustManager implements X509TrustManager {
  13. private static TrustManager[] trustManagers;
  14. private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[] {};
  15. @Override
  16. public void checkClientTrusted(
  17. java.security.cert.X509Certificate[] x509Certificates, String s)
  18. throws java.security.cert.CertificateException {
  19. // To change body of implemented methods use File | Settings | File
  20. // Templates.
  21. }
  22. @Override
  23. public void checkServerTrusted(
  24. java.security.cert.X509Certificate[] x509Certificates, String s)
  25. throws java.security.cert.CertificateException {
  26. // To change body of implemented methods use File | Settings | File
  27. // Templates.
  28. }
  29. public boolean isClientTrusted(X509Certificate[] chain) {
  30. return true;
  31. }
  32. public boolean isServerTrusted(X509Certificate[] chain) {
  33. return true;
  34. }
  35. @Override
  36. public X509Certificate[] getAcceptedIssuers() {
  37. return _AcceptedIssuers;
  38. }
  39. public static void allowAllSSL() {
  40. HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
  41. @Override
  42. public boolean verify(String arg0, SSLSession arg1) {
  43. // TODO Auto-generated method stub
  44. return true;
  45. }
  46. });
  47. SSLContext context = null;
  48. if (trustManagers == null) {
  49. trustManagers = new TrustManager[] { new HTTPSTrustManager() };
  50. }
  51. try {
  52. context = SSLContext.getInstance("TLS");
  53. context.init(null, trustManagers, new SecureRandom());
  54. } catch (NoSuchAlgorithmException e) {
  55. e.printStackTrace();
  56. } catch (KeyManagementException e) {
  57. e.printStackTrace();
  58. }
  59. HttpsURLConnection.setDefaultSSLSocketFactory(context
  60. .getSocketFactory());
  61. }
  62. }

createConnction方法的修改

  1. protected HttpURLConnection createConnection(URL url) throws IOException {
  2. //如果请求是https请求那么就信任所有SSL
  1. <span style="white-space:pre">  </span>if (url.toString().contains("https")) {
  2. HTTPSTrustManager.allowAllSSL();
  3. }
  4. return (HttpURLConnection) url.openConnection();
  5. }

其实就是添加了一个 HTTPSTrustManager类 并在createConnection中调用一下HTTPSTrustManager.allowAllSSL()。

就这么简单= =、

还想发点使用心得,感觉这个有点多了,能看完我这些废话的人已经很有耐心了,所以就不折磨大家了。下次

Volley框架支持HTTPS请求。的更多相关文章

  1. Google Volley框架之https请求

    先插一句.Google出的volley框架本身是支持https请求的,可是仅仅是针对有第三方机构认证过的. 假设自己随便在网上搞的一个证书,那volley是不支持请求的. 本文讲下怎样让volley支 ...

  2. 支持https请求以及https请求的抓包

    iOS9推出的时候,苹果希望大家使用https协议,来提高数据传输之间的安全性.下面我就从最简单的代码介绍,如何在工程中设置,来支持https的请求. 一.证书准备篇 1.证书转换 在服务器人员,给你 ...

  3. Springboot 配置 ssl 实现HTTPS 请求 & Tomcat配置SSL支持https请求

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议.TLS与 ...

  4. iOS开发 支持https请求以及ssl证书配置(转)

    原文地址:http://blog.5ibc.net/p/100221.html 众所周知,苹果有言,从2017年开始,将屏蔽http的资源,强推https 楼主正好近日将http转为https,给还没 ...

  5. 调用外部接口支持https请求

    1,创建RestTemplateConfig.java文件,内容如下: package com.htsec.monitor.internet.config;import com.htsec.monit ...

  6. Volley框架之网络请求和图片加载

    Volley是 Google 推出的 Android 异步网络请求框架和图片加载框架. Volley的特性 (1).封装了的异步的请求API.Volley 中大多是基于接口的设计,可配置性强.(2). ...

  7. 035 Android Volley框架进行网络请求

    1.volley入门介绍 开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进行HTTP通 ...

  8. postman-SSL证书问题-支持HTTPS请求

    使用Google接口调试插件postman请求https协议的接口,postman提示: 为此,需要解决这个问题,提示信息已经给出了解决方案!Using self-signed SSL certifi ...

  9. 【Nginx】使用certbot安装免费https证书使Nginx支持Https请求

    certbot官网:https://certbot.eff.org/lets-encrypt/centosrhel7-nginx 一.安装步骤 1)安装certbot,执行  sudo yum ins ...

随机推荐

  1. log4j的properties详细配置,分级输出日志文件

            log4j是很常用的日志类包,在此做一下配置的记录 加载jar包和properities配置文件             将commons-logging.jar和logging-lo ...

  2. ReactiveCocoa 中signal(operation) then与doNext的区别

    贴源码: doNext:实现的主要源代码 return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) {return [ ...

  3. 移动web前端小结(一)

    这段时间做了几个移动项目的前端页面,姑且称之webapp.做这几个项目之前根本没接触过移动端的相关知识,以为和PC端页面没啥区别无非就是尺寸小一点罢了.上手以后发现问题颇多.下面从框架.相关知识点.遇 ...

  4. (转)Spring MVC

    资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf SpringMVC核心配置文件示例.rar 作者:赵磊 博客:http://elf8848.iteye.com 目录 一.前 ...

  5. s标签可以if elseif else

    首先引用s标签: <%@ taglib prefix="s" uri="/struts-tags" %> 使用s标签进行if elseif else ...

  6. CI框架篇之类库篇--基础(1)

    使用 CodeIgniter 类库: 所有的类库文件存放在system/libraries 文件夹.大多数情况下你需要预先在controller中初始化后才能使用它们: $this->load- ...

  7. javascript 中状态改变触发事件

    转 有限状态机:是一个非常有用的模型,可以模拟世界上大部分事物. 它有三个特征: * 状态总数(state)是有限的. * 任一时刻,只处在一种状态之中. * 某种条件下,会从一种状态转变(trans ...

  8. .NET设计模式(7):创建型模式专题总结(Creational Pattern)

    ):创建型模式专题总结(Creational Pattern)    创建型模式专题总结(Creational Pattern) --.NET设计模式系列之七 Terrylee,2006年1月 转载: ...

  9. c语言学习之基础知识点介绍(四):算术运算符和逗号表达式

    本节主要介绍c语言中运算符. 运算符主要分为四类: 1.算术运算符 加(+),减(-),乘(*),除(/),取余(%,两数相除,得到余数) 2.关系运算符 3.逻辑运算符 4.换位运算符 下面将依次介 ...

  10. 收集SQLServer线程等待信息

    要知道线程等待时间是制约SQL Server效率的重要原因,这一个随笔中将学习怎样收集SQL Server中的线程等待时间,类型等信息,这些信息是进行数据库优化的依据. sys.dm_os_wait_ ...