成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android網絡--我是怎么做的: Volley+OkHttp+Https

移動開發
Volley 已經發布很長時間了, 也已被廣泛應用, 相關教程到處都是. 本文只說兩個值得注意的地方. 本文講解部分比較少, 請參閱提供的相關鏈接. 完整的實現代碼在 Github dodocat/AndroidNetworkDemo 可能看起來比這里更清晰.

使用 OkHttp 作為傳輸層的實現.

Volley 默認根據 Android 系統版本使用不同的 Http 傳輸協議實現.
在 Android 3.0 以上 Volley 使用 ApacheHttpStack 作為傳輸協議, 在2.3 及以下使用 HttpURLConnection 作為傳輸層協議

OkHttp 相較于其它的實現有以下的優點.

  • 支持SPDY,允許連接同一主機的所有請求分享一個socket。
  • 如果SPDY不可用,會使用連接池減少請求延遲。
  • 使用GZIP壓縮下載內容,且壓縮操作對用戶是透明的。
  • 利用響應緩存來避免重復的網絡請求。
  • 當網絡出現問題的時候,OKHttp會依然有效,它將從常見的連接問題當中恢復。
  • 如果你的服務端有多個IP地址,當第一個地址連接失敗時,OKHttp會嘗試連接其他的地址,這對IPV4和IPV6以及寄宿在多個數據中心的服務而言,是非常有必要的。

因此使用 OkHttp 作為替代是好的選擇.

  1. 先用 OkHttp 實現一個新的 HurlStack 用于構建 Volley 的 requestQueue.

    1. public class OkHttpStack extends HurlStack { 
    2.  
    3.  private OkHttpClient okHttpClient; 
    4.  
    5.  /** 
    6.   * Create a OkHttpStack with default OkHttpClient. 
    7.   */ 
    8.  public OkHttpStack() { 
    9.      this(new OkHttpClient()); 
    10.  } 
    11.  
    12.  /** 
    13.   * Create a OkHttpStack with a custom OkHttpClient 
    14.   * @param okHttpClient Custom OkHttpClient, NonNull 
    15.   */ 
    16.  public OkHttpStack(OkHttpClient okHttpClient) { 
    17.      this.okHttpClient = okHttpClient; 
    18.  } 
    19.  
    20.  @Override 
    21.  protected HttpURLConnection createConnection(URL url) throws IOException { 
    22.      OkUrlFactory okUrlFactory = new OkUrlFactory(okHttpClient); 
    23.      return okUrlFactory.open(url); 
    24.  } 
  2. 然后使用 OkHttpStack 創建新的 Volley requestQueue.

    1. requestQueue = Volley.newRequestQueue(getContext(), new OkHttpStack()); 
    2. requestQueue.start(); 

    這樣就行了.

使用 Https

作為一個有節操的開發者應該使用 Https 來保護用戶的數據, Android 開發者網站上文章Security with HTTPS and SSL做了詳盡的闡述.

OkHttp 自身是支持 Https 的. 參考文檔 OkHttp Https, 直接使用上面的 OkHttpStack就可以了, 但是如果遇到服務器開發哥哥使用了自簽名的證書(不要問我為什么要用自簽名的), 就無法正常訪問了.

網上有很多文章給出的方案是提供一個什么事情都不做的TrustManager 跳過 SSL 的驗證, 這樣做很容受到攻擊, Https 也就形同虛設了.

我采用的方案是將自簽名的證書打包入 APK 加入信任.

好處:

  • 應用難以逆向, 應用不再依賴系統的 trust store, 使得 Charles 抓包等工具失效. 要分析應用 API 必須反編譯 APK.
  • 不用額外購買證書, 省錢....

缺點:

  • 證書部署靈活性降低, 一旦變更證書必須升級程序.

實現步驟

以最著名的自簽名網站12306為例說明

  1. 導出證書

    1. echo | openssl s_client -connect kyfw.12306.cn:443 2>&1 |  sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > kyfw.12306.cn.pem 
  2. 將證書轉為 bks 格式
    下載最新的bcprov-jdk, 執行下面的命令. storepass 是導出密鑰文件的密碼.

    1. keytool -importcert -v \ 
    2.  -trustcacerts \ 
    3.  -alias 0 \ 
    4.  -file <(openssl x509 -in kyfw.12306.cn.pem) \ 
    5.  -keystore $CERTSTORE -storetype BKS \ 
    6.  -providerclass org.bouncycastle.jce.provider.BouncyCastleProvider \ 
    7.  -providerpath ./bcprov-jdk16-1.46.jar \ 
    8.  -storepass asdfqaz 
  3. 將導出的 kyfw.bks 文件放入 res/raw 文件夾下.

  4. 創建 SelfSignSslOkHttpStack

    1. /** 
    2. * A HttpStack implement witch can verify specified self-signed certification. 
    3. */ 
    4. public class SelfSignSslOkHttpStack extends HurlStack { 
    5.  
    6.  private OkHttpClient okHttpClient; 
    7.  
    8.  private Map<String, SSLSocketFactory> socketFactoryMap; 
    9.  
    10.  /** 
    11.   * Create a OkHttpStack with default OkHttpClient. 
    12.   */ 
    13.  public SelfSignSslOkHttpStack(Map<String, SSLSocketFactory> factoryMap) { 
    14.      this(new OkHttpClient(), factoryMap); 
    15.  } 
    16.  
    17.  /** 
    18.   * Create a OkHttpStack with a custom OkHttpClient 
    19.   * @param okHttpClient Custom OkHttpClient, NonNull 
    20.   */ 
    21.  public SelfSignSslOkHttpStack(OkHttpClient okHttpClient, Map<String, SSLSocketFactory> factoryMap) { 
    22.      this.okHttpClient = okHttpClient; 
    23.      this.socketFactoryMap = factoryMap; 
    24.  } 
    25.  
    26.  @Override 
    27.  protected HttpURLConnection createConnection(URL url) throws IOException { 
    28.      if ("https".equals(url.getProtocol()) && socketFactoryMap.containsKey(url.getHost())) { 
    29.          HttpsURLConnection connection = (HttpsURLConnection) new OkUrlFactory(okHttpClient).open(url); 
    30.          connection.setSSLSocketFactory(socketFactoryMap.get(url.getHost())); 
    31.          return connection; 
    32.      } else { 
    33.          return  new OkUrlFactory(okHttpClient).open(url); 
    34.      } 
    35.  } 
  5. 然后用 SelfSignSslOkHttpStack 創建 Volley 的 RequestQueue.

    1. String[] hosts = {"kyfw.12306.cn"}; 
    2.  int[] certRes = {R.raw.kyfw}; 
    3.  String[] certPass = {"asdfqaz"}; 
    4.  socketFactoryMap = new Hashtable<>(hosts.length); 
    5.  
    6.  for (int i = 0; i < certRes.length; i++) { 
    7.      int res = certRes[i]; 
    8.      String password = certPass[i]; 
    9.      SSLSocketFactory sslSocketFactory = createSSLSocketFactory(context, res, password); 
    10.      socketFactoryMap.put(hosts[i], sslSocketFactory); 
    11.  } 
    12.  
    13.  HurlStack stack = new SelfSignSslOkHttpStack(socketFactoryMap); 
    14.  
    15.  requestQueue = Volley.newRequestQueue(context, stack); 
    16.  requestQueue.start(); 
  6. 我們來試一試, 用上一步穿件的 RequestQueue 替換掉原來的, 然后發請求試試.

    1. StringRequest request = new StringRequest( 
    2.             Request.Method.GET, 
    3.             "https://kyfw.12306.cn/otn/"
    4.             new Response.Listener<String>() { 
    5.                 @Override 
    6.                 public void onResponse(String response) { 
    7.                     responseContentTextView.setText(response); 
    8.                 } 
    9.             }, 
    10.             new Response.ErrorListener() { 
    11.                 @Override 
    12.                 public void onErrorResponse(VolleyError error) { 
    13.                     responseContentTextView.setText(error.toString()); 
    14.                 } 
    15.             }); 
    16.     RequestManager.getInstance(this).addRequest(request, this); 
  7. done

責任編輯:倪明 來源: 簡書
相關推薦

2012-05-24 14:58:55

開源代碼

2017-07-20 13:11:46

Code ReviewPR評審

2011-03-11 09:53:46

FacebookMySQL

2016-01-05 16:17:59

云夢數據倉

2024-01-04 08:49:03

Vuescope限制

2018-01-08 14:18:14

代碼互聯網持續集成

2015-07-22 11:35:26

2022-03-10 11:25:51

InnoDB優化

2023-09-27 22:44:18

數據遷移數據庫

2021-07-07 12:36:10

HTTPSSSL通信

2017-10-25 09:50:51

Linux

2024-12-04 10:47:26

2019-09-10 09:25:27

分布式系統Elasticsear

2021-05-13 07:32:17

培訓代碼同事

2016-09-21 10:18:26

阿里Dubbo性能測試

2021-05-05 10:48:33

滲透測試漏洞網絡攻擊

2022-08-23 14:51:37

網絡安全領導層存儲

2017-01-12 20:19:37

AndroidContext開發

2019-08-12 08:57:27

HTTPS HTTP網絡協議

2012-11-28 01:47:35

軟件測試測試
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 伊人精品久久久久77777 | 日韩在线视频免费观看 | av一级在线观看 | 亚洲成av人片在线观看无码 | 久久国产综合 | 国产精品久久久久久久久久久久久 | 97成人免费 | www.av在线| 国产视频在线一区二区 | 日韩小视频 | 欧美精品一区二区三区在线播放 | 欧美日韩精选 | 一区二区av | 综合久久久 | 成人免费一区二区三区视频网站 | 一级黄色毛片 | 国产中文字幕在线 | 欧美日韩国产在线观看 | 精品国产乱码一区二区三 | 国产日韩欧美一区二区 | 999久久久| 日韩亚洲视频在线 | 91污在线 | 日韩在线视频免费观看 | 国产色99| 日韩三级一区 | 亚洲第一区国产精品 | 亚洲一区二区高清 | 国产一区二区毛片 | 欧美影院| 日韩一二区 | 成在线人视频免费视频 | 国产亚洲精品久久情网 | 日韩视频精品 | 精品国产乱码久久久久久蜜退臀 | 一区二区三区四区免费在线观看 | 日韩成人免费中文字幕 | 久草新在线 | 天天色综 | 国产在线精品免费 | 人人干人人爽 |