¿Cómo obtengo la dirección remota de un cliente en servlet?

¿Hay alguna forma de que pueda obtener la dirección IP original del cliente que llega al servidor? Puedo usar request.getRemoteAddr() , pero siempre parece obtener la IP del proxy o del servidor web.

Me gustaría saber la dirección IP que el cliente está utilizando para conectarse conmigo. ¿Hay alguna forma de que pueda obtenerlo?

prueba esto:

 public static String getClientIpAddr(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.getHeader("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; } 

request.getRemoteAddr() es el camino. Parece que tu proxy cambia la dirección IP de origen. Cuando algunos proxies hacen esto, agregan la IP original en algún encabezado http personalizado. Utilice request.getHeaderNames() y request.getHeaders(name) e imprima todos para ver si no hay nada de interés. Como X-CLIENT-IP (lo hizo uno, pero se ven así)

No puedes hacer esto de una manera significativa.

El proxy puede o no puede agregar un encabezado de proxies, pero en muchos casos esta será una dirección interna única de todos modos, por lo que no tendrá sentido para usted. La mayoría de los proxies en el borde de una organización están configurados para revelar lo menos posible acerca de las partes internas de la red de todos modos.

¿Para qué pretendes utilizar esta información?

La mejor solución que he usado

 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; } 

Como esto suele ser una preocupación de despliegue, en lugar de una preocupación de la aplicación, otro enfoque sería configurar el contenedor de la aplicación de manera apropiada. Una vez configurado, el contenedor se encarga de inspeccionar el encabezado apropiado y su aplicación continúa utilizando request.getRemoteAddr() .

Por ejemplo, en Tomcat puede usar la válvula IP remota . Asumiría que la mayoría de los servidores de aplicaciones tienen una funcionalidad similar.

El contenedor también podría encargarse de comprender si su equilibrador de carga frontal está terminando las conexiones SSL, reenviando la solicitud al servidor de la aplicación a través de HTTP. Esto es importante cuando su aplicación necesita generar URL a sí misma.

 String ipAddress = request.getHeader("x-forwarded-for"); if (ipAddress == null) { ipAddress = request.getHeader("X_FORWARDED_FOR"); if (ipAddress == null){ ipAddress = request.getRemoteAddr(); } } 

El encabezado de la solicitud “x-forward-for” contiene la IP del cliente original si usa un proxy o un equilibrador de carga. Pero creo que no todos los proxies / lb agregan este encabezado.

Aquí algunos códigos Java para analizar el encabezado: http://www.codereye.com/2010/01/get-real-ip-from-request-in-java.html

Si este encabezado no está presente, procedo como lo sugiere @Bozho

 InetAddress inetAddress = InetAddress.getLocalHost(); String ip = inetAddress.getHostAddress();