获取客户端的IP地址

时间:2013-05-15 07:10:26

标签: java web-applications servlets ip

我正在使用 JSP Servlets (容器: Glassfish )开发一个Web应用程序,我需要在其中获取客户端{{1} }。

我正在获取客户端的IP地址,因为我想只在拥有办公室的计算机上访问某些页面(如客户维护表单),我想限制访问办公室以外的那些页面。

以下是我的代码:

WAY1

IP Address

way2

String ipAddress =  request.getRemoteAddr();
System.out.println("IP Address: "+ipAddress);

每次重新启动计算机时,上面的代码都会给我String ipAddress=null; String getWay = request.getHeader("VIA"); // Gateway ipAddress = request.getHeader("X-FORWARDED-FOR"); // proxy if(ipAddress==null) { ipAddress = request.getRemoteAddr(); } System.out.println("IP Address: "+ipAddress); (关机 - >开始或重启)。

我得到different IP Address喜欢:

IP6

让我知道这段代码有什么问题?

5 个答案:

答案 0 :(得分:68)

正如@martin和this answer解释的那样,这很复杂。获取客户端的IP地址没有防弹方法。

您可以做的最好的事情是尝试解析"X-Forwarded-For"并依赖request.getRemoteAddr();

public static String getClientIpAddress(HttpServletRequest request) {
    String xForwardedForHeader = request.getHeader("X-Forwarded-For");
    if (xForwardedForHeader == null) {
        return request.getRemoteAddr();
    } else {
        // As of https://en.wikipedia.org/wiki/X-Forwarded-For
        // The general format of the field is: X-Forwarded-For: client, proxy1, proxy2 ...
        // we only want the client
        return new StringTokenizer(xForwardedForHeader, ",").nextToken().trim();
    }
}

答案 1 :(得分:31)

我使用以下静态帮助器方法来检索客户端的IP:

public static String getClientIpAddr(HttpServletRequest request) {  
    String ip = request.getHeader("X-Forwarded-For");  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("Proxy-Client-IP");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("WL-Proxy-Client-IP");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("HTTP_X_FORWARDED");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("HTTP_X_CLUSTER_CLIENT_IP");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("HTTP_CLIENT_IP");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("HTTP_FORWARDED_FOR");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("HTTP_FORWARDED");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("HTTP_VIA");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("REMOTE_ADDR");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getRemoteAddr();  
    }  
    return ip;  
}

答案 2 :(得分:7)

我喜欢这个,你可以尝试一下

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

答案 3 :(得分:3)

如basZero所述,应检查X-Forwarded-For是否为逗号。 (看看:http://en.wikipedia.org/wiki/X-Forwarded-For)。该领域的一般格式是: X-Forwarded-For:clientIP,proxy1,proxy2 ......等等。所以我们将看到类似的东西:X-FORWARDED-FOR:129.77.168.62,129.77.63.62。

答案 4 :(得分:1)

我认为这更多地与您的网络配置方式有关。 Servlet只是给你它找到的地址。

我可以建议两种解决方法。首先尝试使用IPV4。见SO Answer

另外,尝试使用request.getRemoteHost()方法获取计算机的名称。当然,名称与它们映射到的任何IP无关。

我仍然认为你应该和你的基础设施人员讨论这个问题。