0

我应该捕获访问我的 Web 应用程序的客户端计算机的 IP 地址。谷歌搜索后,我发现了两种方法:

  1. request.getRemoteAddr()

  2. request.getHeader("X-FORWARDED-FOR")

但它们都不能保证返回客户端机器的实际 ip。另外,我应该使用struts1.2来实现相同的目的,因为该应用程序是在 struts1.2 中开发的。

有没有相同的struts类?

我正在使用以下代码:

String ipAddress = request.getHeader("X-FORWARDED-FOR");  
if (ipAddress == null) {  
    ipAddress = request.getRemoteAddr();  
}

但是当我从移动或无线设备访问应用程序时,该方法会request.getHeader("X-FORWARDED-FOR");返回。null

结果,ip是从方法获得request.getRemoteAddr(); 的问题是检索到的ip是私有的而不是公共 的,但我想要客户端的公共ip

4

2 回答 2

1

问题是没有办法保证它。客户端可能是 NAT-ted,因此无论如何您都无法找到客户端知道的地址,并且如果客户端通过代理连接(对于某些类别的设备很常见,或者当连接来自某些位置)那么就无法保证代理会告诉您客户端的地址是什么。那里有一些严重损坏的代理,即使工作正常,它们仍可能被配置为隐藏您正在寻找的信息。

最简单的技术可能是在客户端上运行一些 javascript 以发现信息并在后台请求中将其发送给您。但是你会发现客户的地址通常不是很有用。您肯定不能将其用于身份验证目的(NAT 和通过 DHCP 进行动态地址分配的广泛流行意味着您经常会获得具有相同“内部”地址的不同客户端)或连接回客户端(大多数客户端运行强大的防火墙或位于防火墙后面),我不知道您为什么要记录它。这是你能要求的最没用的东西。我建议您从这个问题中退后一步,重新考虑一下您真正想要做的事情。

于 2012-09-15T11:22:20.110 回答
1

request.getRemoteAddr()在大多数情况下将返回正确的地址(这是 Java EE 的一部分,而不是 struts)。它们不保证返回客户端机器的实际 IP,因为这是 TCP/IP 限制的问题,而不是结构或 Java 本身。

于 2012-09-13T05:06:41.873 回答