如何在 Java 中从 CNAME 获取主机名?

Jes*_*sse 2 java cname

在 Java 中,如何获得给定 CNAME(规范名称)的服务器的主机名?

例如,我有 CNAME“xyz”,但我想获得关联的主机名“myhost”。

我尝试使用,java.net.InetAddress.getHostName()但它只是返回了我提供的 CNAME。

例如:

String myCNAME = "xyz";
InetAddress inetAddress = InetAddress.getByName(myCNAME);
System.out.printf("My hostname = '%s'", inetAddress.getHostName());
Run Code Online (Sandbox Code Playgroud)

只返回给定的 CNAME:

My hostname = 'xyz'
Run Code Online (Sandbox Code Playgroud)

相反,我想获得主机名“myhost”。

Fab*_*ank 5

Java 附带了一个包含的 DNS 客户端,但不幸的是,当您在网络上搜索诸如“Java DNS”之类的内容时,它没有很好的文档记录并且不太明显。以下代码段使用 Java 的内置 DNS 客户端来解析 CNAME 记录:

Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
InitialDirContext idc = new InitialDirContext(env);
Attributes attrs = idc.getAttributes("something.example.com", new String[]{"CNAME"});
Attribute attr = attrs.get("CNAME");
System.out.println(attr.get());
Run Code Online (Sandbox Code Playgroud)

存在一些(不太好)的文档:https : //docs.oracle.com/javase/jndi/tutorial/beyond/env/overview.html https://docs.oracle.com/javase/8/docs/technotes/ guides/jndi/jndi-dns.html(找不到 10+ 的更新链接)

依赖 InetAddress 的解决方案的缺点是不考虑 CNAME 记录,而是执行 A 查找,然后进行反向查找以从 IP 返回主机名,但反向查找返回的主机名通常是与 CNAME 查找实际指向的主机名不同的主机名。