第一次写帖子,嘿嘿。

最近了解到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. 解决Flash挡住层用z-index无效的问题

    有时我们要用flash做透明背景结果发现加好之后下面的文字连接点击不了了,div下拉也给flash档住了,后来百度发现我们只要设置wmode参数就可解决了.   在HTML中,如果嵌入Flash,默认 ...

  2. (转)Spring 读书笔记-----使用Spring容器(一)

    Spring有两个核心接口:BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口.他们都可代表Spring容器,Spr ...

  3. [时间操作] C#DateFormat时间帮助类 (转载)

    点击下载 DateFormat.rar 主要功能如下 返回每月的第一天和最后一天 看下面代码吧 /// <summary> /// 类说明:时间操作类 /// 编 码 人:苏飞 /// 联 ...

  4. 译文:如何使用SocketAsyncEventArgs类(How to use the SocketAsyncEventArgs class)

      转载自: http://blog.csdn.net/hulihui/article/details/3244520 原文:How to use the SocketAsyncEventArgs c ...

  5. 在Android上模拟登录广工正方教务系统查询成绩

    这是在博客园里开博以来写的第一篇博客. 因为之前看过很多人都有发过关于模拟登录正方软件获取数据的文章,自己觉得挺好玩的便也去动手一做,开始还以为挺难的,但实际做起来还蛮简单的,当然其中还有些小插曲. ...

  6. JS一些应用脚本

    脚本一: //重置下标(可以修改成自己所需要的脚本) function ReSetBoxOrder() { var q = 0;//下标值 var a = 0;//暂未用到 //循环当前tbody下的 ...

  7. 数据库msqlserver的几种类型及解决MSSQLServer服务启动不了的问题

    从08年开始学习了sqlserver数据库之后,就一直以为sqlserver只有版本的区分,没有类型的差异:总以为从Sql2000. sql2005到sql2008.sql2012,微软出口的数据库, ...

  8. ios动力特效,最重要的一点 属性保持(写了动力特效但是没效果的原因就在这里)

    @property (nonatomic, strong) UIDynamicItemBehavior *square1PropertiesBehavior; @property (nonatomic ...

  9. 3DTouch

    3DTouch 一.主屏按压(Home Screen Quik Actions) 1.静态标签 在info.plist文件中新增项 关键字 意义 UIApplicationShortcutItems ...

  10. Codeforces 553C Love Triangles(图论)

    Solution: 比较好的图论的题. 要做这一题,首先要分析love关系和hate关系中,love关系具有传递性.更关键的一点,hate关系是不能成奇环的. 看到没有奇环很自然想到二分图的特性. 那 ...