【问题标题】:Get host name in java在java中获取主机名
【发布时间】:2017-08-14 21:55:42
【问题描述】:

我正在使用 jdk 8 和 weblogic server 12 R2c。我的应用程序是面向公众的,我需要获取客户端的主机名。如果客户端主机名在可以访问应用程序的允许主机名列表中,则会向它们显示一些特殊功能。现在我的问题是如何获取主机名。我尝试了以下代码,但出现以下错误:

错误:

  1. java.net.UnknownHostException: 234:343:343f:d1d34:a34:c%c3:45263:ab3c, 449.6.087.678: IPv6 地址无效
  2. java.net.UnknownHostException: 14.5.254.458, 65.15.5.15: 未知错误。

    在 java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method) 在 java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928) 在 java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323) 在 java.net.InetAddress.getAllByName0(InetAddress.java:1276) 在 java.net.InetAddress.getAllByName(InetAddress.java:1192)

以上所有 IP 地址都是从我的服务器日志中获取的示例虚拟地址。

String ipAdr = request.getHeader("X-FORWARDED-FOR");
  if (ipAdr == null) {
    ipAdr = request.getRemoteAddr();
  }
  InetAddress addr = null;
  String host = null;
  if (ipAddress != null) {
    addr = InetAddress.getByName(ipAdr);
    host = addr.getHostName();
  }

碰巧请求可能来自代理服务器,在这种情况下如何获取域名。 上面的 Tee 位于为每个请求调用的过滤器代码中。

【问题讨论】:

  • 是的,代理服务器使用 X-FORWARD-FOR 标头来帮助识别 USER IP 地址。但是,如果用户位于防火墙后面,那么您的服务器将看到防火墙的 IP 地址。现在,您可以获得 IPv4 和 IPv6。互联网上有一些代码可以让您验证和匹配正确的 IP 范围。
  • 请注意,不能保证反向查找需要成功。如果源主机没有reverse DNS entry,则无法检索其名称,如果可解析,则返回的名称不需要与任何转发主机名匹配。
  • 谢谢,问题已通过 request.getHotName 解决。非常感谢您的帮助。

标签: java hostname


【解决方案1】:

这是我用来获取机器主机名的sn-p代码,请参考this回答为什么你不应该使用IP地址获取主机名。

public class App {
    private final static String HOSTNAME_COMMAND = "hostname";

    private static  String getHostName() throws IOException {
        Process process = Runtime.getRuntime().exec(HOSTNAME_COMMAND);
        BufferedReader inputStreamReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        BufferedReader errorStreamReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
        if (errorStreamReader.readLine() != null) {
            throw new RuntimeException(String.format("Failed to get the hostname, exception message: %s",
                    errorStreamReader.readLine()));
        }
        return inputStreamReader.readLine();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    相关资源
    最近更新 更多