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

时间:2015-01-06 20:55:48

标签: 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());

只需返回给定的CNAME:

My hostname = 'xyz'

相反,我希望得到主机名" myhost"。

2 个答案:

答案 0 :(得分:2)

如果您拥有CNAME,请使用java.net.InetAddress.getCanonicalHostName()获取服务器主机名。

http://download.java.net/jdk7/archive/b123/docs/api/java/net/InetAddress.html#getCanonicalHostName()

示例:

String myCNAME = "xyz";
InetAddress inetAddress = InetAddress.getByName(myCNAME);
System.out.printf("My hostname = '%s'", inetAddress.getCanonicalHostName());

<强>输出:

My hostname = 'myhost.example.com'

注意:这将返回FQDN,因此您还将获得“myhost.example.com”的“example.com”。

答案 1 :(得分:2)

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());

存在一些(不是很好)的文档: 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查找实际指向的主机名不同的主机名。