java获取域名CNAME 或A 记录解析值 lookup 和 dig 方式

1 篇文章 0 订阅
1 篇文章 0 订阅


需要导入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(","));
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值