【问题标题】:Does JNDI use the DNS search list?JNDI 是否使用 DNS 搜索列表?
【发布时间】:2011-05-04 08:55:45
【问题描述】:

我想使用 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 这么说

如果 sun.net.spi.nameservice.domain 属性未定义,则提供商将使用平台 DNS 配置中配置的任何域或域搜索列表。

(属性未设置。)Java版本为Sun Java 1.6.0_20。

JNDI 是否使用 DNS 搜索列表?

【问题讨论】:

    标签: java dns jndi srv


    【解决方案1】:

    【讨论】:

      猜你喜欢
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多