2012-08-24 14 views
8

Tengo una aplicación web y para eso quiero capturar la dirección IP de los clientes que están accediendo a mi sitio web para que pueda saber qué región es la que más accede a la aplicación. Estoy usando Java EE en mi aplicación.¿Cómo puedo determinar por qué dirección IP se ha accedido a mi sitio web?

Probablemente hay alguna solución si hablamos de encabezado y cuándo se envía request desde el usuario final.

+0

Normalmente su empresa de alojamiento proporcionaría tales características – adarshr

+2

El contenedor de servlets de su elección registrará todos los accesos de clientes. Si desea obtener la IP programáticamente, use [ServletRequest.getRemoteAddr()] (http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getRemoteAddr%28%29). –

+0

Oye, parece interesante el método API que me has contado. De hecho, lo utilicé en mi servlet al que se envía la solicitud desde la página jsp. Pero aún así no está mostrando ningún valor. ¿Necesito usar el método request.getParameter() para este propósito, pero cómo? – Prateek

Respuesta

15

Uso método getRemoteAddr() desde la interfaz ServletRequest o métodos de interfaz getHeaders() forma HttpServletRequest:

HttpServletRequest httpRequest = (HttpServletRequest) request; 
String userIpAddress = httpRequest.getHeader("X-Forwarded-For"); 

Hay una advertencia por el método de getRemoteAddr:

que usted puede usar el método y en el caso general usted recibirá IP del cliente Sin embargo, el método es inútil si un usuario está detrás de un proxy. En este caso, obtendrá la dirección IP del servidor proxy y no el cliente. Pero el proxy puede incluir la IP del cliente solicitante en un encabezado especial HTTP. Por lo tanto, para recuperar el cliente real-cliente-llame al método getHeader("X-Forwarded-For").

Un ejemplo de uso de JSP:

El valor de uso conjunto de direcciones IP en sesión usando JSTL:

<c:set var="userIp" value="${requestScope.header('x-forwarded-for')}" scope="session" /> 

y luego obtener este valor de la sesión en un lugar conveniente.

En JSP puede utilizar <c:out value="${sessionScope.userIp}" /> o servlet como session.getAttribute('userIp');

Lea docs:

java.lang.String getRemoteAddr() devuelve la dirección de Protocolo de Internet (IP) del cliente o último proxy que envió la solicitud.

+0

Gracias por la dirección correcta. Pero la solución aquí es dónde usar este método en el jsp que tiene el botón de formulario y enviar. O dentro del servlet final donde realmente va y luego envía los datos a la base de datos. – Prateek

+0

Debe tener acceso a la 'solicitud'. Use el valor establecido de la dirección IP en sesión usando [JSTL] (http://www.oracle.com/technetwork/java/index-jsp-135995.html): ''. Y luego obtenga este valor de la sesión en un lugar conveniente. En JSP como '' o en servlet como 'session.getAttribute ('userIp');'. – kapand

+0

Cuando uso este método, la salida viene 'null /' en la base de datos, mientras que en el caso de getRemoteAddr() la salida de la base de datos viene como '0: 0: 0: 0: 0: 1 /:' qué significa esto. – Prateek

0

El objeto de solicitud se pasa como un argumento de Java al método de servlet generado a partir de su JSP. El nombre del argumento es ... espere ... request.

Por lo tanto, debería poder consultarlo en un scriptlet incrustado en su JSP; p.ej.

<% 
     InetAddress addr = request.getRemoteAddr(); 
     // blah blah blah 
    %> 

Es discutible si debe estar haciendo este tipo de cosas en un JSP. En general, se acepta como "mejor práctica" que los JSPs se utilicen solo para formatear la salida. La lógica comercial de una aplicación web debe estar en un servlet de controlador que luego se reenvía al servlet JSP para generar el HTML (o lo que sea).

Si se va a poner la lógica de negocio en un JSP, scriptlets tienden a ser difíciles de mantener ... aunque si estás solo va a mostrar la dirección IP, que no debería ser una preocupación. (El enfoque preferido desde una perspectiva de ingeniería es usar etiquetas y el lenguaje de expresión JSP.)

Por último, no hay garantía de que la dirección IP devuelta por getRemoteAddr() sea la dirección IP del cliente real. Podría ser la dirección de un proxy, o incluso una fabricación completa.

+1

Primero, el método [getRemoteAddr()] (http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getRemoteAddr%28%29) pertenece a la interfaz [ServletRequest] (http : //docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getRemoteAddr%28%29) y no requiere enviar una solicitud a [HttpServletRequest] (http: // docs. oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html). Además, este método El método no siempre puede devolver la dirección IP del usuario. En tercer lugar, los scriptlets son una mala práctica. – kapand

+0

Conozco el MVC, pero usar un scrip let como el anterior me podría ayudar a resolverlo de alguna manera, ya que no es posible incluso utilizando un parámetro oculto para obtener la dirección IP. Para llevar el parámetro con el objeto de solicitud, tengo que usar el <%%> scrip let somewhere. Pero esto está dando error. ¿Debo colocar esto en la misma forma que está enviando datos? – Prateek

+0

En el caso de que use solo JSP puro, entonces puede resolver su problema usando scriptlets: '<% // su código java%>'. El hecho de que JSP finalmente se transformó en un servlet. Por lo tanto, este código funcionará de la misma manera. Esta es una solución aceptable para un proyecto de prueba pequeño, pero dicho código será inconveniente para comprender y mantener si se desarrolla y crece. – kapand

1

Junto con las respuestas mencionadas anteriormente (por Andrey y Stephen) utilice también alguna herramienta analytics. Le dará una idea más amplia del tráfico que llega a su sitio web. Un ejemplo de esto es Google Analytics.

+0

Tengo una cuenta de Google Analytics. Pero dentro de la aplicación quiero trazar un gráfico basado en los éxitos de IP únicos que tengo. Para eso, Google Analytics no puede ayudar. – Prateek

+0

@pKs: estoy de acuerdo. si desea consumirlo dentro de su aplicación, entonces no puede usar análisis. – pratikabu

Cuestiones relacionadas