java - JNDI 是否使用 DNS 搜索列表?

标签 java dns jndi srv

我想使用 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/

相关文章:

java - 为什么 Active Directory 不返回 PagedResultsResponseControl?

java - 在 jUnit 中设置 JNDI 数据源

java - 跨 JVM 检测

java - Hibernate:多对一使用公式

java - 选择列并从其他选择中隐藏

dns - 将域指向名称服务器

java - 仅具有 "Setters"和 "Getters"的类 - 优点

c# - 无法解析 DNS

google-cloud-platform - 在没有 Firebase 的情况下将自定义域指向 GCP 云功能

tomcat - 在 Tomcat for Oracle 中使用 JNDI 的分步指南