2011-05-04 69 views
1

我想使用JNDI在本地網絡中查找Kerberos SRV記錄。我試圖以有希望的方式猜測本地域名。如果失敗,我想查找簡單的條目,例如_kerberos._tcp沒有任何後綴,並依靠DNS域搜索列表來查找正確的條目。這可以在Windows上使用nslookup -type=srv _kerberos._tcp和Linux使用host -t srv _kerberos._tcp。附加域example.test並找到該條目。JNDI是否使用DNS搜索列表?

下面是一個例子程序通過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搜索列表?

回答