【问题标题】:How to get the client sysytem ip using java? [duplicate]如何使用java获取客户端系统ip? [复制]
【发布时间】:2014-11-12 09:30:00
【问题描述】:

我正在开发 Web 应用程序,我需要知道谁都在访问我的 Web 应用程序,因为我需要运行我的应用程序的系统的 ip (ipv4) 地址。我正在使用 jsp 和 servlet 谁能帮我解决这个问题???

我尝试了下面的代码,但每次用户访问应用程序时它都会显示我的 IP 地址。但我需要客户端 IP (ipv4) 地址。

try {
                 Enumeration e = NetworkInterface.getNetworkInterfaces();

                 while(e.hasMoreElements()) {
                    NetworkInterface ni = (NetworkInterface) e.nextElement();
                    System.out.println("Net interface: "+ni.getName());

                    Enumeration e2 = ni.getInetAddresses();

                    while (e2.hasMoreElements()){
                       InetAddress ip = (InetAddress) e2.nextElement();
                       System.out.println("IP address: "+ ip.toString());
                    }
                 }
              }
              catch (Exception e) {
                 e.printStackTrace();
              }

【问题讨论】:

  • NetworkInterface.getNetworkInterfaces() 获取运行 JVM 的网络接口,即您的服务器。
  • 你的标题说你想要客户端的IP,但你的问题说你想要“运行我的应用程序的系统地址”,这将是服务器。目前还不清楚你想要哪个。您的代码似乎在寻找服务器的 IP 地址,但这不会告诉您谁在访问您的应用程序。
  • @Wyzard:他需要客户端 IP 地址(“运行我的应用程序”意味着“在浏览器中”)。

标签: java jsp servlets


【解决方案1】:

在HttpServletRequest对象上,可以使用如下函数获取远程主机:

request.getRemoteHost()

【讨论】:

  • 大多数实时系统都有代理,您的客户端请求将通过代理到达后端。在这种情况下,您的方法将返回该代理的详细信息。
  • 真的!在这种情况下,应该可以将代理服务器配置为在标头中包含原始主机。
  • @Petter 谢谢它正在工作
  • @Petter 它在 linux 系统中运行良好,但在 windows 中无法运行,为什么?
  • @Petter 我使用它,它在 linux 系统中运行良好,因为在我们的网络中,linux 系统不在代理中,但在 windows 系统中它有一个代理,因此它为所有 windows 系统提供默认 IP 地址我能做什么做
【解决方案2】:
Normally, you can use servletRequest.getRemoteAddr() to get the client’s IP address that’s accessing your Java web application.

   String ipAddress = request.getRemoteAddr();

But, if user is behind a proxy server or access your web server through a load balancer (for example, in cloud hosting), the above code will get the IP address of the proxy server or load balancer server, not the original IP address of a client.

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

【讨论】:

    【解决方案3】:

    有几种方法可以做到这一点:

    • 你可以使用HttpServletRequest#getRemoteAddr(),但是它返回一个对应于客户端或最后一个代理的IP地址,这可能不是你所需要的(如果你真的想要客户端,那就是)
    • 您可以查看一些 HTTP 标头,例如 REMOTE_ADDR、HTTP_X_FORWARDED_FOR(IP 列表)、HTTP_CLIENT_IP、HTTP_X_FORWARDED、HTTP_X_CLUSTER_CLIENT_IP、HTTP_FORWARDED_FOR 和 HTTP_FORWARDED。 xxx_forwarded_ 标头应该为您提供真实的 IP 地址(而不是代理),但可能为空(例如,某些代理不转发此标头)。

    请注意,这些 ip 很容易被欺骗,不应依赖于任何关键(安全等)

    【讨论】:

      【解决方案4】:

      你也可以这样检查,

      public String getRemoteIpAddress(HttpServletRequest req) {      
       String ip = req.getHeader("x-forwarded-for");      
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {      
           ip = req.getHeader("Proxy-Client-IP");      
        }      
          if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {      
           ip = req.getHeader("WL-Proxy-Client-IP");      
        }      
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {      
            ip = req.getRemoteAddr();      
        }      
        return ip;      
      }   
      

      如果用户在代理服务器后面或通过负载均衡器访问您的 Web 服务器(例如,在云托管中),上述代码将获取代理服务器或负载均衡器服务器的 IP 地址,而不是原始 IP 地址一个客户。

      要解决这个问题,您应该获取请求的 HTTP 标头“X-Forwarded-For (XFF)”的 IP 地址。

       //is client behind something?
       String ipAddress = request.getHeader("X-FORWARDED-FOR");  
       if (ipAddress == null) {  
           ipAddress = request.getRemoteAddr();  
       }
      

      【讨论】:

      • 我使用上面的代码,它在 linux 系统中运行良好,因为在我们的网络中,linux 系统不在代理中,但在 windows 系统中它有一个代理,因此它为所有 windows 系统提供默认 IP 地址我能做什么做
      • 我已经更新了答案,尽管我没有 Windows 机器,但请检查一下。所以无法检查。确认!!
      猜你喜欢
      • 2014-06-05
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 2011-02-20
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      相关资源
      最近更新 更多