2

我在使用 InetAdress.getHostName()java 中的类时遇到问题。在某些情况下,java 类没有得到正确的结果。在这种情况下,我只收到 IP 地址(如预期的错误)。

这很可能是我们网络的 dns 配置中的错误。但是,如果我使用带有 的命令行nslookup,我会收到正确的答案。

java 是否使用与系统其他部分不同的 DNS 配置?谁能解释这怎么可能发生?有替代方案getHostName()吗?

4

2 回答 2

0

获取主机名

获取此 IP 地址的主机名。

获取CanonicalHostName

获取此 IP 地址的完全限定域名

于 2013-09-03T12:37:45.443 回答
0

我看到这是一个很老的问题,但今天我遇到了同样的问题,看起来我找到了一个原因。问题是,java(至少 openjdk 版本“1.8.0_121”)首先查找“PTR”记录,然后,如果找到任何结果,java 尝试执行“A”记录查找,比较返回的“A” " 查询到的初始 IP 号的记录。如果没有为“A”查询找到此类 IP,Java 将不会返回“PTR”查找结果。他们称之为“防止欺骗”。这是图书馆的来源:

private static String getHostFromNameService(InetAddress addr, boolean check) {
String host = null;
for (NameService nameService : nameServices) {
    try {
        // first lookup the hostname
        host = nameService.getHostByAddr(addr.getAddress());

        /* check to see if calling code is allowed to know
         * the hostname for this IP address, ie, connect to the host
         */
        if (check) {
            SecurityManager sec = System.getSecurityManager();
            if (sec != null) {
                sec.checkConnect(host, -1);
            }
        }

        /* now get all the IP addresses for this hostname,
         * and make sure one of them matches the original IP
         * address. We do this to try and prevent spoofing.
         */

        InetAddress[] arr = InetAddress.getAllByName0(host, check);
        boolean ok = false;

        if(arr != null) {
            for(int i = 0; !ok && i < arr.length; i++) {
                ok = addr.equals(arr[i]);
            }
        }

        //XXX: if it looks a spoof just return the address?
        if (!ok) {
            host = addr.getHostAddress();
            return host;
        }

        break;

我能说什么?省略淘气的话 - 什么都没有。由于此库是从 Oracle JRE 共享的,因此我们无能为力。

于 2017-04-04T03:48:42.633 回答