【发布时间】:2017-10-15 04:43:51
【问题描述】:
我有一个java spring MVC Web 应用程序,我正在尝试获取正在访问该应用程序的客户端计算机的 IP 地址。我尝试了下面显示的代码,
InetAddress addr = InetAddress.getLocalHost();
String ipAddr = addr.getHostAddress();
但这会返回本地主机的 IP 地址。 我还尝试了一些其他在网上找到的建议,如下所示:
String remoteAddr = "";
if (request != null) {
remoteAddr = request.getHeader("X-FORWARDED-FOR");
if (remoteAddr == null || "".equals(remoteAddr)) {
remoteAddr = request.getRemoteAddr();
}
}
这也没有给出正确的 IP 地址。我还尝试了以下方法,但对我没有任何帮助: https://www.mkyong.com/java/how-to-get-client-ip-address-in-java/
what is the right way to get request's ip
没有给我正确的 IP 地址。有什么解决方案可以让我尝试获取正在访问我的应用程序的机器的正确 IP 地址。
【问题讨论】:
-
哪里错了?我的意思是你得到什么IP?请注意,如果客户端位于 NAT 防火墙后面,则无法获取客户端 IP 地址,只能获取防火墙地址。
-
你不能可靠地做到这一点。如果客户端在进行 NAT 的路由器后面——就像大多数人在访问互联网时一样——你将获得的最好的就是路由器的 IP。当您的服务在代理和/或负载均衡器后面运行时,如果所有这些组件都正确设置并转发 X-FORWARDED-FOR 标头,您将只能获得客户端 IP。例如,在 Kubernetes 1.4 上运行的 Google-Container-Engine 中,根本没有机会获取客户端的 IP,因为 kubernetes 没有传递它。所以你可以尝试,但没有可靠的方法。
-
@Andreas ,我正在尝试从 IP 111.92.68.2 访问应用程序。但是使用上述代码打印的 IP 不是正确的 192.168.0.1 或 127.0.0.1
-
getLocalHost()返回服务器环回地址(127.0.0.1),所以肯定不是这样。其他代码应该已经打印了客户端 IP,但是像192.168.0.1这样的内部 IP 地址意味着您的服务器可能位于不转发该信息的 HTTP 代理或负载平衡器后面。但是,它可能只是使用不同的名称,所以尝试转储(打印/记录)所有 HTTP 标头并查看。
标签: java spring-mvc servlets httprequest