2011-01-13 17 views
53

¿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.¿Cómo obtengo la dirección remota de un cliente en servlet?

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

Respuesta

8

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. Use request.getHeaderNames() y request.getHeaders(name) e imprima todos para ver si no hay nada de interés. Como X-CLIENT-IP (hizo uno, pero se ven así)

+0

gracias, voy a comprobar las cabeceras .... aunque cuando pasa a través de un servidor web, por ejemplo, i luego obtener la dirección del servidor web – grassbl8d

+2

¿Quieres decir request.getHeaderNames()? – theyuv

4

No puede 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é quiere usar esta información?

+0

bueno, de alguna manera tengo que registrar la dirección de los usuarios que están accediendo. tienes razón, algunos proxies parecen eliminarlo y a menudo tengo el proxy reemplazándolo ... estaba pensando si tal vez podría obtener algo de información de la sesión SSL – grassbl8d

88

probar 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; 
    } 
+0

¿Está bien, en este caso, usar if conditiona en su lugar de if/else? – Andrew

+1

sí, porque necesitamos verificar si la operación anterior fue exitosa o no, tal vez usar do-while sería mejor –

+1

X-Forwarded-For puede contener más de una dirección IP. – dmatej

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

"x remitido para la" cabecera de la solicitud contiene el cliente IP original si se utiliza un proxy o un equilibrador de carga. Pero creo que no todos los proxies/lb agregan este encabezado.

Aquí algo de código Java para analizar la cabecera: http://www.codereye.com/2010/01/get-real-ip-from-request-in-java.html

Si esta cabecera no está presente, entonces me gustaría proceder como @Bozho sugiere

4

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

Como esto generalmente es una preocupación de implementación, 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 usando request.getRemoteAddr().

Por ejemplo, en Tomcat puede usar el Remote IP Valve. Asumiría que la mayoría de los servidores de aplicaciones tienen una funcionalidad similar.

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

-5
InetAddress inetAddress = InetAddress.getLocalHost(); 
String ip = inetAddress.getHostAddress(); 
+0

Esto solo da la IP del localhost. –

Cuestiones relacionadas