java - 使用部分域名的 JNDI DNS 查找

标签 java dns jndi srv

例如,如果我在 DNS 配置中定义了以下 SRV 记录

_dev._tcp          IN      SRV     0       0       8400   dev.server.com.

我可以执行以下命令

host -lt SRV server.com

它为我提供了 dns 服务器 (server.com) 中 SRV 记录的完整列表。如果我想使用 JNDI 查找做同样的事情

Hashtable<String, String> env = new Hashtable<String, String>();
env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory");
DirContext ctx = new InitialDirContext(env);
Attributes attributes = ctx.getAttributes("server.com", new String [] { "SRV" });
return attributes;

上面的代码没有返回任何属性。如果我将上面代码中的倒数第二行更改为这样,

Attributes attributes = ctx.getAttributes("_dev._tcp.server.com", new String [] { "SRV" });

它有效。

但问题是我之前不知道完整的域名,我必须查找 SRV 记录才能找到完整的域名。

关于如何做到这一点有什么想法吗?

最佳答案

/usr/bin/host-l 参数指示 DNS 区域传输。与传统的 DNS 查询不同,区域传输通过 TCP 进行。

这是 host -lt SRV server.com 的作用:

  1. 查找 server.com 的名称服务器。
  2. 使用 TCP 连接到第一个列出的名称服务器的端口 53。
  3. 启动区域传输。
  4. 根据其 -t srv 过滤器过滤出结果。

您需要通过 JNDI 启动区域传输并筛选出您要查找的结果。在 DnsContext 中调用 DNS 区域传输的方法是 list()

NamingEnumeration<NameClassPair> names = ctx.list("server.com");

恕我直言,JNDI 的界面很糟糕。它被设计为非常通用的所有命名和目录服务,并且接口(interface)和 DNS 之间的机械和技术不匹配简直令人沮丧。

如果您正在寻找更实用、更易于使用且功能齐全的 DNS 库,请查看 dnsjava 项目 http://www.dnsjava.org

另请记住,并非每个 DNS 服务器都允许来自不受信任的主机的区域传输。如今,即使是 LAN DNS 服务器也默认不允许区域传输。

关于java - 使用部分域名的 JNDI DNS 查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6527263/

相关文章:

javax.naming.NoInitialContextException

java - 有没有办法用tomcat实现X-Robots-Tag指令?

java - IntelliJ IDEA - 错误 : JavaFX runtime components are missing,,需要运行此应用程序

azure - 如何为 Azure 网站创建替代名称?

c++ - cpp 检查字符串是否是有效域名?

java - Spring4中需要xml bean的java表示

tomcat - 从 Tomcat 连接到 JBoss 7.1.1 中的 EJB 时,JNDI 查找失败

java - 如何测试从其客户端接收多个请求的 Web 服务?

java - eclipse中变量的自动生成方法

dnsmasq 标签和条件 dns 服务器