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

使用java获取客户机的ip地址,java,web-applications,ip-address,struts-1,Java,Web Applications,Ip Address,Struts 1,我应该捕获访问我的web应用程序的客户机的ip地址。 在谷歌搜索之后,我找到了两种方法: request.getRemoteAddr() request.getHeader(“X-FORWARDED-FOR”) 但这两种方法都不能保证返回客户机的实际ip。 另外,我应该使用struts1.2实现同样的功能,因为应用程序是在struts1.2中开发的 是否有任何struts类用于相同的功能 我正在使用以下代码: String ipAddress = request.getHeader("X-FOR

我应该捕获访问我的web应用程序的客户机的ip地址。 在谷歌搜索之后,我找到了两种方法:


  • request.getRemoteAddr()

  • 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

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

    问题在于无法保证。客户机可能是NAT ted,因此在这种情况下,您无论如何都无法找到客户机知道的地址,并且如果客户机通过代理进行连接(对于某些类型的设备来说是通用的,或者当连接来自某些位置时),则无法保证代理会告诉您客户机的地址。有一些严重损坏的代理,即使在正常工作时,它们仍可能被配置为隐藏您正在查找的信息


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

    Heyy。。谢谢你抽出时间。我已经编辑了这个问题,请帮忙