我想使用 JNDI 查找本地网络中的 Kerberos SRV 记录。我尝试以聪明的方式猜测本地域。如果失败,我想查找简单的条目,例如_kerberos._tcp
没有任何后缀,并依靠 DNS 域搜索列表来查找正确的条目。这适用于使用 nslookup -type=srv _kerberos._tcp
的 Windows 和使用 host -t srv _kerberos._tcp
的 Linux。域 example.test
将被附加并找到该条目。
下面是一个通过 JNDI 进行 DNS 查找的示例程序:
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
public class JndiDnsTest {
public static void main(String[] args) {
if (args.length < 2) {
System.out.println("Usage: " + JndiDnsTest.class.getName() +
" name record-types...");
return;
}
String name = args[0];
String[] recordTypes = new String[args.length - 1];
System.arraycopy(args, 1, recordTypes, 0, args.length - 1);
Hashtable<String, String> env = new Hashtable<String,String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
try {
DirContext ctx = new InitialDirContext(env);
Attributes dnsQueryResult = ctx.getAttributes(name, recordTypes);
if (dnsQueryResult == null) {
System.out.println("Not found: '" + name + "'");
}
for (String rrType: recordTypes) {
Attribute rr = dnsQueryResult.get(rrType);
if (rr != null) {
for (NamingEnumeration<?> vals = rr.getAll(); vals.hasMoreElements();) {
System.out.print(rrType + "\t");
System.out.println(vals.nextElement());
}
}
}
} catch (NamingException e) {
e.printStackTrace(System.err);
}
System.out.println("\nThe DNS search list:");
for (Object entry: sun.net.dns.ResolverConfiguration.open().searchlist()) {
System.out.println(entry);
}
System.out.println("\nsun.net.spi.nameservice.domain = " +
System.getProperty("sun.net.spi.nameservice.domain"));
}
}
在我看来,JNDI 只对直接名称进行一次查找。未找到上述命令成功的条目。看起来它不使用 DNS 搜索列表。不过,它的内容正确地打印在底部。
另一方面,Networking properties documentation说的是
If the sun.net.spi.nameservice.domain property is not defined then the provider will use any domain or domain search list configured in the platform DNS configuration.
(未设置该属性。)Java 版本是 Sun Java 1.6.0_20。
JNDI 是否使用 DNS 搜索列表?
最佳答案
关于java - JNDI 是否使用 DNS 搜索列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5880939/