我在使用时遇到问题
java中的InetAdress.getHostName()
类。在某些情况下,java类没有得到正确的结果。在这种情况下,我收到(正如错误预期的那样)IP地址。
很可能这是我们网络的DNS配置中的错误。但是,如果我使用命令行nslookup
,我会收到正确的答案。
java是否使用与系统其他部分不同的DNS配置?有谁能解释这可能会发生什么?
getHostName()
还有其他选择吗?
答案 0 :(得分:0)
答案 1 :(得分: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;
我能说什么?省略顽皮的话 - 没什么。 由于这个lib是从Oracle JRE共享的,所以我们无能为力。