Skip to main content
Cables de red

Recuperar la IP del cliente en Java tras un balanceador

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.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

CERRAR