使用java获取客户端计算机的ip地址

时间:2012-09-13 04:34:07

标签: java web-applications ip-address struts-1

我应该捕获客户端计算机的IP地址,他会点击我的网络应用程序。 谷歌搜索后,我发现了两种方式:

  1. request.getRemoteAddr()

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

  3. 但是他们都不保证返回客户端机器的实际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

2 个答案:

答案 0 :(得分:1)

在大多数情况下,

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

答案 1 :(得分:1)

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

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