如何在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"。
答案 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查找实际指向的主机名不同的主机名。