第一次写帖子,嘿嘿。

最近了解到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. IIS Shared Configuration

    Introduction The Internet changes the ways in which companies handle their day-to-day business and h ...

  2. HDU-1020(水题)

    Encoding Problem Description Given a string containing only 'A' - 'Z', we could encode it using the ...

  3. Intent.Action

    1 Intent.ACTION_MAIN String: android.intent.action.MAIN 标识Activity为一个程序的开始.比较常用. Input:nothing Outpu ...

  4. java动态绑定的情况分析

    java是面向对象的语言,java中多态的一种情况是动态绑定.所谓的动态绑定,分两种情况:当调用类方法的时候,java虚拟机会基于对象的引用类型来选择执行方法.当java调用一个实例方法的时候,他会根 ...

  5. HDU 1074 Doing Homework (dp+状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:学生要完成各科作业, 给出各科老师给出交作业的期限和学生完成该科所需时间, 如果逾期一 ...

  6. C++静态成员函数访问非静态成员的几种方法

    大家都知道C++中类的成员函数默认都提供了this指针,在非静态成员函数中当你调用函数的时候,编译器都会“自动”帮你把这个this指针加到函数形参里去.当然在C++灵活性下面,类还具备了静态成员和静态 ...

  7. TCPIP通信

    最近在开发TCPIP通信,封装了3个类,望各位大神指点指点. using System; using System.Collections.Generic; using System.Text; us ...

  8. C#程序中:如何修改xml文件中的节点(数据)

    要想在web等程序中实现动态的数据内容给新(如网页中的Flash),不会更新xml文件中的节点(数据)是远远不够的,今天在这里说一个简单的xml文件的更新,方法比较基础,很适合初学者看的,保证一看就懂 ...

  9. ie9以上浏览器input文本框/密码框后面的小叉子/小眼睛问题

    找了很久不知什么属性控制的这个东西,经过群友的指点重要找到.

  10. js 中对象属性特性的描述

    如何自定义属性的特性? 用对象.属性的特性和自定义的属性的特性有什么区别? 它的四大特性 writable   enumerable   configable   有什么区别? 先预习一个用对象.属性 ...