【发布时间】:2017-08-14 21:55:42
【问题描述】:
我正在使用 jdk 8 和 weblogic server 12 R2c。我的应用程序是面向公众的,我需要获取客户端的主机名。如果客户端主机名在可以访问应用程序的允许主机名列表中,则会向它们显示一些特殊功能。现在我的问题是如何获取主机名。我尝试了以下代码,但出现以下错误:
错误:
- java.net.UnknownHostException: 234:343:343f:d1d34:a34:c%c3:45263:ab3c, 449.6.087.678: IPv6 地址无效
-
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 解决。非常感谢您的帮助。