我在Java中使用JNDI在我的应用程序中执行DNS查找以解析A记录 - 在Windows 7上的Java 8下运行。但是,除非我指定包含域名的完整主机条目,否则我无法解析记录。
Java似乎忽略了在PC上配置的DNS搜索列表。我没有问题,包括域名,如果这是Java要求的,但我找不到公共方法来获取搜索列表中的域。
以下SSCCE使用私有方法sun.net.dns.ResolverConfiguration
来获取DNS搜索列表,但我不应该使用它,因为它是内部专有API,可能会在将来的版本中删除。
import java.util.*;
import javax.naming.*;
import javax.naming.directory.*;
public class SSCCE {
public static void main(String[] args) {
String[] hostsToLookup = new String[] { "testhost", "testhost.mydomain.com" };
try {
System.out.println("DNS Search List:");
for (Object o: sun.net.dns.ResolverConfiguration.open().searchlist()) {
System.out.println(" " + o);
}
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
InitialDirContext idc = new InitialDirContext(p);
for (String h : hostsToLookup) {
System.out.println("Host: " + h);
try {
Attributes attrs = idc.getAttributes(h, new String[] { "A" });
Attribute attr = attrs.get("A");
if (attr != null) {
for (int i = 0; i < attr.size(); i++) {
System.out.println(" " + attr.get(i));
}
}
}
catch (NameNotFoundException e) {
System.out.println(" undefined");
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
当我仅使用它无法解析的主机部分来运行时,但是当我从搜索列表中手动添加域时,它会这样做:
DNS Search List:
mydomain.com
Host: testhost
undefined
Host: testhost.mydomain.com
192.0.2.1
是否有可能使Java使用JNDI尊重DNS搜索列表,或者是否有公共方法来获取DNS搜索列表?