Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JNDI是否使用DNS搜索列表?_Java_Dns_Jndi_Srv - Fatal编程技术网

Java JNDI是否使用DNS搜索列表?

Java JNDI是否使用DNS搜索列表?,java,dns,jndi,srv,Java,Dns,Jndi,Srv,我想使用JNDI在本地网络中查找Kerberos SRV记录。我试着用聪明的方式猜测本地域。如果失败,我希望查找普通条目,例如不带任何后缀的\u kerberos.\u tcp,并依靠DNS域搜索列表找到正确的条目。这适用于Windows上的nslookup-type=srv\u kerberos.\u tcp和Linux上的host-t srv\u kerberos.\u tcp。添加域示例.test,并找到条目 下面是一个通过JNDI进行DNS查找的示例程序: import java.uti

我想使用JNDI在本地网络中查找Kerberos SRV记录。我试着用聪明的方式猜测本地域。如果失败,我希望查找普通条目,例如不带任何后缀的
\u kerberos.\u tcp
,并依靠DNS域搜索列表找到正确的条目。这适用于Windows上的
nslookup-type=srv\u kerberos.\u tcp
和Linux上的
host-t srv\u kerberos.\u tcp
。添加域
示例.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"));
    }
}
import java.util.Hashtable;
导入javax.naming.Context;
导入javax.naming.NamingEnumeration;
导入javax.naming.NamingException;
导入javax.naming.directory.Attribute;
导入javax.naming.directory.Attributes;
导入javax.naming.directory.DirContext;
导入javax.naming.directory.InitialDirContext;
公共类JNDINSTEST{
公共静态void main(字符串[]args){
如果(参数长度<2){
System.out.println(“用法:”+jndindnstest.class.getName()+
“名称记录类型…”);
返回;
}
字符串名称=args[0];
字符串[]记录类型=新字符串[args.length-1];
System.arraycopy(args,1,recordTypes,0,args.length-1);
Hashtable env=新的Hashtable();
put(Context.INITIAL\u Context\u工厂,“com.sun.jndi.dns.DnsContextFactory”);
试一试{
DirContext ctx=新的初始DirContext(env);
Attributes dnsQueryResult=ctx.getAttributes(名称、记录类型);
if(dnsQueryResult==null){
System.out.println(“未找到:“+name+””);
}
for(字符串类型:记录类型){
属性rr=dnsQueryResult.get(rrType);
如果(rr!=null){
对于(namingumeration vals=rr.getAll();vals.hasMoreElements();){
系统输出打印(rrType+“\t”);
System.out.println(vals.nextElement());
}
}
}
}捕获(NamingE例外){
e、 printStackTrace(System.err);
}
System.out.println(“\nDNS搜索列表:”);
for(对象条目:sun.net.dns.ResolverConfiguration.open().searchlist()){
系统输出打印项次(输入);
}
System.out.println(“\nsun.net.spi.nameservice.domain=”+
System.getProperty(“sun.net.spi.nameservice.domain”);
}
}
在我看来,JNDI只对直接名称进行一次查找。在上述命令成功的地方找不到条目。它似乎没有使用DNS搜索列表。不过,它的内容在底部打印正确

另一方面,政府说

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

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

JNDI是否使用DNS搜索列表?

这是一个已知的错误-