我正在使用jdk 8和weblogic服务器12 R2c。我的应用程序面向公众,我需要获取客户端的主机名。如果客户端主机名在允许访问应用程序的允许主机名列表中,则会向其显示一些特殊功能。现在我的问题是如何获取主机名。我尝试了下面的代码,我收到以下错误:
错误:
java.net.UnknownHostException:14.5.254.458,65.15.5.15:未知错误。
at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method) at java.net.InetAddress $ 2.lookupAllHostAddr(InetAddress.java:928) at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323) at 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位于为每个请求调用的过滤器代码中。
答案 0 :(得分:0)
以下是我用来获取计算机主机名的代码段,有关为什么不应该使用IP地址获取主机名的信息,请参阅this答案。
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();
}
}