HTTPDNS Android SDK已在v1.0.12版本中下线同步解析接口String getIpByHost(String host)和String[] getIpsByHost(String host)。从安全角度我们强烈建议用户使用异步解析接口。在DDOS攻击等特殊场景下,HTTPDNS有可能会触发流量黑洞,此时同步接口就有可能出现短暂的请求解析超时等待,而异步接口的网络请求都是后台操作的,业务层面不会感知到请求超时的动作,能够做到对异常情况的冗余。
- /**
- * 同步解析接口,首先查询缓存,若存在则返回结果,若不存在则进行同步域名解析请求,解析完成返回最新解析结果,若解析失败返回null。
- *
- * @param host 域名(如www.aliyun.com)
- * @return 域名对应的解析结果
- */
- String getIpByHost(String host);
- /**
- * 同步解析接口, 获取ip列表,首先查询缓存,若存在则返回结果,若不存在则进行同步域名解析请求,解析完成返回最新解析结果,若解析失败返回长度为0 的String 数组。
- *
- * @param host
- * @return 域名对应的解析结果列表
- */
- 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字段的值,如:
- String originalUrl = "http://www.aliyun.com/";
- URL url = new URL(originalURL);
- String originalHost = url.getHost();
- // 异步接口获取IP
- String ip = httpdns.getIpsByHostAsync(originalHost);
- HttpURLConnection conn;
- if (ip != null) {
- // 通过HTTPDNS获取IP成功,进行URL替换和HOST头设置
- url = new URL(originalUrl.replaceFirst(originalHost, ip));
- conn = (HttpURLConnection) url.openConnection();
- // 设置请求HOST字段
- conn.setRequestProperty("Host", originHost);
- } else {
- conn = (HttpURLConnection) url.openConnection();
- }
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的私有协议字段来解决这个问题,比如:
- 目标URL:http://www.aliyun.com/product/oss/
- 通过HTTPDNS解析出来的www.aliyun.com的IP:1.1.1.1
- 代理:10.0.0.172:80
- 您的HTTP请求头:
- GET http://1.1.1.1/product/oss/ HTTP/1.1 # 通过代理发起的HTTP请求头,请求行是一个绝对路径
- Host: www.aliyun.com # 这个Header会被代理网关忽略,代理网关会使用请求行绝对路径中的host字段作为源站的host,即1.1.1.1
- X-Online-Host: www.aliyun.com # 这个Header就是移动网关为了传递真实Host添加的私有头部,源站需要配置识别该私有头部以获取真实的Host信息
同样您可以通过setRequestProperty方法进行X-Online-Host请求头域的设置,并在服务端设置对该私有头域的解析。
在绝大多数场景下,我们建议您在代理模式下关闭HTTPDNS功能。
4. 混淆配置
- -keep class com.alibaba.sdk.android.**{*;}
- -keep class com.ut.**{*;}
- -keep class com.ta.**{*;}