文档章节

vollery框架支持https

遇见sunshine
 遇见sunshine
发布于 2016/01/22 09:56
字数 742
阅读 149
收藏 0

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

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


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

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

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

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

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

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


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

package com.android.volley.toolbox;  
  
import java.security.KeyManagementException;  
import java.security.NoSuchAlgorithmException;  
import java.security.SecureRandom;  
import java.security.cert.X509Certificate;  
  
import javax.net.ssl.HostnameVerifier;  
import javax.net.ssl.HttpsURLConnection;  
import javax.net.ssl.SSLContext;  
import javax.net.ssl.SSLSession;  
import javax.net.ssl.TrustManager;  
import javax.net.ssl.X509TrustManager;  
  
public class HTTPSTrustManager implements X509TrustManager {  
  
    private static TrustManager[] trustManagers;  
    private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[] {};  
  
    @Override  
    public void checkClientTrusted(  
            java.security.cert.X509Certificate[] x509Certificates, String s)  
            throws java.security.cert.CertificateException {  
        // To change body of implemented methods use File | Settings | File  
        // Templates.  
    }  
  
    @Override  
    public void checkServerTrusted(  
            java.security.cert.X509Certificate[] x509Certificates, String s)  
            throws java.security.cert.CertificateException {  
        // To change body of implemented methods use File | Settings | File  
        // Templates.  
    }  
  
    public boolean isClientTrusted(X509Certificate[] chain) {  
        return true;  
    }  
  
    public boolean isServerTrusted(X509Certificate[] chain) {  
        return true;  
    }  
  
    @Override  
    public X509Certificate[] getAcceptedIssuers() {  
        return _AcceptedIssuers;  
    }  
  
    public static void allowAllSSL() {  
        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {  
  
            @Override  
            public boolean verify(String arg0, SSLSession arg1) {  
                // TODO Auto-generated method stub  
                return true;  
            }  
  
        });  
  
        SSLContext context = null;  
        if (trustManagers == null) {  
            trustManagers = new TrustManager[] { new HTTPSTrustManager() };  
        }  
  
        try {  
            context = SSLContext.getInstance("TLS");  
            context.init(null, trustManagers, new SecureRandom());  
        } catch (NoSuchAlgorithmException e) {  
            e.printStackTrace();  
        } catch (KeyManagementException e) {  
            e.printStackTrace();  
        }  
  
        HttpsURLConnection.setDefaultSSLSocketFactory(context  
                .getSocketFactory());  
    }  
  
}

createConnction方法的修改

protected HttpURLConnection createConnection(URL url) throws IOException {  
    //如果请求是https请求那么就信任所有SSL
    if (url.toString().contains("https")) {  
              HTTPSTrustManager.allowAllSSL();  
        }  
        return (HttpURLConnection) url.openConnection();  
    }

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

本文转载自:http://blog.csdn.net/ysh06201418/article/details/46860179

遇见sunshine
粉丝 3
博文 55
码字总数 21695
作品 0
海淀
程序员
私信 提问
Play Framework - 接口定义&与客户端交互

接口定义: 频道列表: 接口名称:channelList 参数说明: 名称 类型 是否必选 说明 offset int 是 当前游标偏移量 count int 否 请求总数,默认为10 请求实例: {"client": { },"data": { }...

烟火飘零
2015/11/25
165
0
imi v0.1.0 中秋版正式发布,支持模型多态关联!

值此中秋佳节来临之际,imi 日渐完善,决定提升版本,从升为,依旧处于实战开发完善阶段。 祝大家放假快乐!~ v0.1.0 更新内容: 新增 新增支持模型多态一对一、一对多、多对多 新增支持模型...

宇润
2018/09/21
1K
2
PHP异步协程框架Group-Co 1.0.5支持MySQL注册中心

PHP 异步协程框架 Group-Co 1.0.5 已发布,更新如下: 支持 MySQL 注册中心 服务支持自定义用户进程 新增心跳监控进程类 文档整理优化 文档地址:https://fucongcong.gitbooks.io/group-co/c...

coco1225
2017/11/08
1K
7
ThinkCMF 5.1.0 发布:支持 swoole、协议变更为 MIT

ThinkCMF5.1 做你的专属开发框架,让你更自由地飞 ThinkCMF5.1化繁为简,基于ThinkPHP 5.1重构所有核心代码 ,目标是做你的专属开发框架,让开发者更自由地创作,开发者只需关注,,和 的业务...

ThinkCMF
03/08
912
1
IMI v0.0.2 支持 PHP 7.0 + Swoole 4.0,引入 Redis 模型

更新内容 * 框架依赖更新:php >= 7.1 + swoole >= 4.0.0 (之前为 php 7.0 + swoole 2.2.0) * 新增 Redis 模型 * 新增双驼峰转换方法 * 新增文件,目录创建操作方法 * 新增session操作类自...

宇润
2018/06/25
1K
4

没有更多内容

加载失败,请刷新页面

加载更多

正则表达式匹配

请实现一个函数用来匹配包括 '.' 和 '*' 的正则表达式。模式中的字符 '.' 表示任意一个字符,而 '*' 表示它前面的字符可以出现任意次(包含 0 次)。 在本题中,匹配是指字符串的所有字符匹配...

Garphy
37分钟前
5
0
Laravel 5.1的多路由文件的配置

默认的路由配置文件只有一个, \app\Http\routes.php。 在同一个文件中写路由容易起冲突,文件会越来越大,就需要定义多个路由文件。 找到加载\app\Http\routes.php的文件, 打开\app\Provid...

mdoo
今天
5
0
Hibernate 5 开始使用指南前言

同时在面向对象软件和关系型数据库进行工作,可能会非常复杂和费时。数据在对象和数据库之间可能会不一致,然后导致开发成本会非常高。 Hibernate 是一个针对 Java 环境的对象关系映射(Obj...

honeymoose
今天
5
0
聊聊nacos ServiceManager的UpdatedServiceProcessor

序 本文主要研究一下nacos ServiceManager的UpdatedServiceProcessor ServiceManager.init nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/core/ServiceManager.java @Compone......

go4it
今天
7
0
正则表达式的使用(QQ格式的判断与空格的切割)

//正则表达式的使用 public static void main(String[] args) throws IOException, ClassNotFoundException { //test1("123456"); test2("-1 99 kk"); } /** * ......

zhengzhixiang
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部