Podemos recupera la IP del cliente que accede a nuestra aplicación web Java mediante el código:
String ipAddress = request.getRemoteAddr();
Ahora bien, si el servidor está detrás de un balanceador de carga lo que obtendremos siempre con la sentencia anterior es la IP del balanceador. En estos casos debemos obtener la IP que viaja en alguna de las cabecera de la petición HTTP, mediante el código:
public String getIpAddr(HttpServletRequest request) { final String[] HEADER_LIST = { "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" }; for (String header : HEADERS_LIST) { String ip = request.getHeader(header); if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip) && !isPrivateAdress(ip)) { return ip; } } return request.getRemoteAddr(); } public boolean isPrivateAdress(String host) { try { return java.net.InetAddress.getByName(host).isSiteLocalAddress(); } catch (UnknownHostException e) { LOGGER.warn("UnknownHostException en isPrivateAdress(String host)", e); return true; } }
El método “getIpAddr” devolvería la IP pública del cliente. Si lo que queremos es simplemente recuperar la IP pública o privada del cliente, aunque esté detrás de un proxy, tendríamos que quitar la comprobación de si la IP es privada:
public String getIpAddr(HttpServletRequest request) { final String[] HEADER_LIST = { "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" }; for (String header : HEADERS_LIST) { String ip = request.getHeader(header); LOGGER.debug("Contenido del header "+ header + " / "+ ip); if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) { return ip; } } return request.getRemoteAddr(); }
Espero que te haya resultado útil. Si tienes cualquier duda o problema con el código, déjame tu comentario.