取域名CNAME 或A 记录解析值
需要导入dnsjava包
<dependency>
<groupId>dnsjava</groupId>
<artifactId>dnsjava</artifactId>
<version>3.5.1</version>
</dependency>
/**
* 获取域名解析
*
* @param domain 域名
* @param type 类型 A记录 或者 CNAME
*/
public static String getResolving(String domain, int Type.CNAME) {
Resolver resolver;
Lookup lookup;
try {
resolver = new SimpleResolver("114.114.114.114");
lookup = new Lookup(domain, type);
} catch (TextParseException | UnknownHostException e) {
throw new RuntimeException(e);
}
lookup.setResolver(resolver);
org.xbill.DNS.Cache cache = new org.xbill.DNS.Cache();
lookup.setCache(cache);
lookup.run();
if (lookup.getResult() == Lookup.SUCCESSFUL) {
String[] results = cache.toString().split("\\n");
for (String result : results) {
String rule = "(?<=\\[)(.+?)(?=.])";
Pattern pattern = Pattern.compile(rule);
Matcher matcher = pattern.matcher(result);
while (matcher.find()) {
return matcher.group();
}
}
}
return null;
}
返回结果:["01ae493e724a644f7cfd73a6f4fd8d1.cmcdxwvcbgdv3xxx.xxxx"]
上边的这种方式获取解析记录在实践时十分耗时。下面推荐另外一种方式获取解析
/**
*
* @param domainName 域名
* @param server 部署项目的服务器ip ,可以使用 cat /etc/resolv.conf 查看nameserver 获得
*/
private static List<String> getDigResults(String domainName, String server) {
InputStream is = null;
BufferedReader br = null;
Process p = null;
StringBuffer sbf = new StringBuffer();
try {
String cmd = MessageFormat.format("dig @{0} {1} +short", server, domainName);
p = Runtime.getRuntime().exec(cmd);
p.waitFor();
is = p.getInputStream();
br = new BufferedReader(new InputStreamReader(is, "utf-8"));
String tmp;
while ((tmp = br.readLine()) != null) {
if (StringUtils.isNotBlank(tmp))
if (tmp.charAt(tmp.length()-1) == '.') {
sbf.append(tmp.substring(0, tmp.length() - 1) + ",");
} else {
sbf.append(tmp + ",");
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(br);
IOUtils.closeQuietly(is);
p.destroy();
return Arrays.asList(sbf.toString().split(","));
}
}