如何在Java HttpServletRequest中获取客户端IP地址

Sam*_*han 23 java ip servlets

我正在尝试开发一个Java Web应用程序(Servlet),我需要获取客户端的IP地址.

请不要将此视为重复问题,因为我尝试了stackoverflow中可用的所有可能答案.

以下是我的代码到目前为止:

1)

String ipAddress =  request.getRemoteAddr();
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我获得了"默认网关地址"(147.120.1.5).不是我的机器IP地址(174.120.100.17).

2)

String ipAddress = request.getHeader("X-FORWARDED-FOR");  
   if (ipAddress == null) {  
       ipAddress = request.getRemoteAddr();  
   } 
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我获得了"默认网关地址"(147.120.1.5).不是我的机器IP地址(174.120.100.17).

3)

InetAddress IP=InetAddress.getLocalHost();
System.out.println(IP.getHostAddress());
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我得到了服务器IP地址(147.120.20.1).

我在147.120.100.17中的IP地址.现在我不知道如何获取真正的客户端IP地址.请回答.

非常感谢你.

gih*_*han 48

试试这个,

    String ipAddress = request.getHeader("X-FORWARDED-FOR");  
       if (ipAddress == null) {  
         ipAddress = request.getRemoteAddr();  
   }
Run Code Online (Sandbox Code Playgroud)

参考:http://www.mkyong.com/java/how-to-get-client-ip-address-in-java/

  • X-FORWARD-FOR标头在这里有点风险.因为如果您对请求使用反向代理,则此标头值将如下所示:231.23.45.65,10.20.10.33,10.20.20.34(表示客户端IP,负载平衡器服务器,反向代理服务器).检查您的X-FORWARD-FOR标头值是否包含",".`ipAddress.contains(",")?ipAddress.split(",")[0]:ipAddress` (16认同)
  • 当我使用上面的代码时,我得到的是“ localhost”而不是我的IP地址。 (2认同)

小智 6

Try this one. for all condition

  private static final String[] HEADERS_TO_TRY = {
            "X-Forwarded-For",
            "Proxy-Client-IP",
            "WL-Proxy-Client-IP",
            "HTTP_X_FORWARDED_FOR",
            "HTTP_X_FORWARDED",
            "HTTP_X_CLUSTER_CLIENT_IP",
            "HTTP_CLIENT_IP",
            "HTTP_FORWARDED_FOR",
            "HTTP_FORWARDED",
            "HTTP_VIA",
            "REMOTE_ADDR"};

    private String getClientIpAddress(HttpServletRequest request) {
        for (String header : HEADERS_TO_TRY) {
            String ip = request.getHeader(header);
            if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
                return ip;
            }
        }
        return request.getRemoteAddr();
    }
Run Code Online (Sandbox Code Playgroud)

  • 在答案中添加一些解释总是一个好主意,以便OP可以实际学习一些东西。 (4认同)