开发者社区> 问答> 正文

HTTPDNS Android SDK开发指南使用方法(2)




HTTPDNS Android SDK已在v1.0.12版本中下线同步解析接口String getIpByHost(String host)String[] getIpsByHost(String host)。从安全角度我们强烈建议用户使用异步解析接口。在DDOS攻击等特殊场景下,HTTPDNS有可能会触发流量黑洞,此时同步接口就有可能出现短暂的请求解析超时等待,而异步接口的网络请求都是后台操作的,业务层面不会感知到请求超时的动作,能够做到对异常情况的冗余。

  1. /**
  2. * 同步解析接口,首先查询缓存,若存在则返回结果,若不存在则进行同步域名解析请求,解析完成返回最新解析结果,若解析失败返回null。
  3. *
  4. * @param host 域名(如www.aliyun.com)
  5. * @return 域名对应的解析结果
  6. */
  7. String getIpByHost(String host);
  8. /**
  9. * 同步解析接口, 获取ip列表,首先查询缓存,若存在则返回结果,若不存在则进行同步域名解析请求,解析完成返回最新解析结果,若解析失败返回长度为0 的String 数组。
  10. *
  11. * @param host
  12. * @return 域名对应的解析结果列表
  13. */
  14. String[] getIpsByHost(String host);




2.2 使用示例




您可以通过获取alicloud-android-demo工程源码获得HTTPDNS服务的使用例程。




3. 注意事项



3.1 HTTP请求头HOST字段设置




标准的HTTP协议中服务端会将HTTP请求头HOST字段的值作为请求的域名信息进行解析。使用HTTPDNS后,您可能需要将HTTP请求URL中的HOST字段替换为HTTPDNS解析获得的IP,这时标准的网络库会将您的IP赋值给HTTP请求头的HOST字段,进而导致服务端的解析异常(服务端认可的是您的域名信息,而非IP信息)。为了解决这个问题,您可以主动设置HTTP请求HOST字段的值,如:
  1. String originalUrl = "http://www.aliyun.com/";
  2. URL url = new URL(originalURL);
  3. String originalHost = url.getHost();
  4. // 异步接口获取IP
  5. String ip = httpdns.getIpsByHostAsync(originalHost);
  6. HttpURLConnection conn;
  7. if (ip != null) {
  8.     // 通过HTTPDNS获取IP成功,进行URL替换和HOST头设置
  9.     url = new URL(originalUrl.replaceFirst(originalHost, ip));
  10.     conn = (HttpURLConnection) url.openConnection();
  11.     // 设置请求HOST字段
  12.     conn.setRequestProperty("Host", originHost);
  13. } else {
  14.     conn = (HttpURLConnection) url.openConnection();
  15. }




3.2 COOKIE字段




部分网络库支持COOKIE的自动存储管理,当您使用HTTPDNS进行IP URL请求时,部分网络库会将您URL中的IP信息作为COOKIE对应的域名信息进行存储管理(而非HTTP请求头HOST字段信息),进而造成COOKIE管理与使用上的困扰,因此您需要关闭COOKIE的自动管理功能(默认关闭)。




3.3 HTTPS/WebView/SNI场景







3.4 代理情况下的使用




当存在中间HTTP代理时,客户端发起的请求中请求行会使用绝对路径的URL,在您开启HTTPDNS并采用IP URL进行访问时,中间代理将识别您的IP信息并将其作为真实访问的HOST信息传递给目标服务器,这时目标服务器将无法处理这类无真实HOST信息的HTTP请求。移动网关提供了X-Online-Host的私有协议字段来解决这个问题,比如:
  1. 目标URL:http://www.aliyun.com/product/oss/
  2. 通过HTTPDNS解析出来的www.aliyun.com的IP:1.1.1.1
  3. 代理:10.0.0.172:80
  4. 您的HTTP请求头:
  5. GET http://1.1.1.1/product/oss/ HTTP/1.1     # 通过代理发起的HTTP请求头,请求行是一个绝对路径
  6. Host: www.aliyun.com                         # 这个Header会被代理网关忽略,代理网关会使用请求行绝对路径中的host字段作为源站的host,即1.1.1.1
  7. X-Online-Host: www.aliyun.com                # 这个Header就是移动网关为了传递真实Host添加的私有头部,源站需要配置识别该私有头部以获取真实的Host信息

同样您可以通过setRequestProperty方法进行X-Online-Host请求头域的设置,并在服务端设置对该私有头域的解析。
在绝大多数场景下,我们建议您在代理模式下关闭HTTPDNS功能。




4. 混淆配置



  1. -keep class com.alibaba.sdk.android.**{*;}
  2. -keep class com.ut.**{*;}
  3. -keep class com.ta.**{*;}


展开
收起
猫饭先生 2017-10-20 14:37:27 1942 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
跨平台的云服务SDK需要什么 立即下载
Android内存泄漏自动化链路分析组件Probe 立即下载
一个跨平台的云服务SDK需要什么 立即下载