obtener httpservletrequest cliente java servlets ip clientip

httpservletrequest - java web get client ip



Obtenga IP de cliente real en un servlet (3)

Esta pregunta ya tiene una respuesta aquí:

Estoy teniendo problemas con un problema simple. Me gustaría obtener la IP del cliente real dentro de un HTTPServlet .

Desde ahora utilicé:

request.getRemoteAddr()

Pero ahora devuelve una IP falsa. por ejemplo: xxx.xxx.xxx. 50 pero mi IP es algo así como xxx.xxx.xxx. 159 . (verificado en http://whatismyipaddress.com/ ).

Ahora traté de usar:

request.getHeader("X-Forwarded-For")

Devuelve NULL.

También tomé una sonda con la siguiente clase:

public class IpUtils { public static final String _255 = "(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"; public static final Pattern pattern = Pattern.compile("^(?:" + _255 + "//.){3}" + _255 + "$"); public static String longToIpV4(long longIp) { int octet3 = (int) ((longIp >> 24) % 256); int octet2 = (int) ((longIp >> 16) % 256); int octet1 = (int) ((longIp >> 8) % 256); int octet0 = (int) ((longIp) % 256); return octet3 + "." + octet2 + "." + octet1 + "." + octet0; } public static long ipV4ToLong(String ip) { String[] octets = ip.split("//."); return (Long.parseLong(octets[0]) << 24) + (Integer.parseInt(octets[1]) << 16) + (Integer.parseInt(octets[2]) << 8) + Integer.parseInt(octets[3]); } public static boolean isIPv4Private(String ip) { long longIp = ipV4ToLong(ip); return (longIp >= ipV4ToLong("10.0.0.0") && longIp <= ipV4ToLong("10.255.255.255")) || (longIp >= ipV4ToLong("172.16.0.0") && longIp <= ipV4ToLong("172.31.255.255")) || longIp >= ipV4ToLong("192.168.0.0") && longIp <= ipV4ToLong("192.168.255.255"); } public static boolean isIPv4Valid(String ip) { return pattern.matcher(ip).matches(); } public static String getIpFromRequest(HttpServletRequest request) { String ip; boolean found = false; if ((ip = request.getHeader("x-forwarded-for")) != null) { StringTokenizer tokenizer = new StringTokenizer(ip, ","); while (tokenizer.hasMoreTokens()) { ip = tokenizer.nextToken().trim(); if (isIPv4Valid(ip) && !isIPv4Private(ip)) { found = true; break; } } } if (!found) { ip = request.getRemoteAddr(); } return ip; } }

También devolvió el IP xxx.xxx.xxx.50. :(

Ahora no sé cómo obtener la IP del cliente real. Si alguien conoce la solución, por favor haz una respuesta.


Cuando tiene un dispositivo NAT (Traducción de direcciones de red) antes de su contenedor de servlets request.getRemoteAddr() devuelve la dirección de NAT, ya que inicia una nueva conexión.

Para resolver su problema, debe configurar su NAT para enviar en un encabezado la IP del cliente original. Luego, para tomar el encabezado de la solicitud. En caso de que configure en el encabezado NAT X-Forwarded-For use este código: request.getHeader("X-Forwarded-For")

Tu función es correcta, puedes usarla cuando configuras NAT.


Supongo que su problema es que está ejecutando el servidor en alguna parte de la red local, por lo que obtiene su IP en esa red. Sin embargo, cuando intenta utilizar el servicio en línea que descubre su dirección IP, su IP es la IP del enrutador de su proveedor de servicios o algo así. Usar request.getRemoteAddr() es correcto. Esto es lo que hacen esos servicios y no tienen otras instalaciones.


Java

String ip = request.getRemoteAddr(); if (ip.equalsIgnoreCase("0:0:0:0:0:0:0:1")) { InetAddress inetAddress = InetAddress.getLocalHost(); String ipAddress = inetAddress.getHostAddress(); ip = ipAddress; } model.addAttribute("IP", ip); JSP <span><B>IP : <c:out value="${IP}" /></B></span> // Spring MAV

JSP

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ page import="java.net.InetAddress" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Displays Client IP Address</title> </head> <body> <% // paste above java code out.println("<br><B>Clients IP : </B>"+ip); %> <span><br>Local Host : <%= request.getRemoteAddr() %></span> <span><br>ServerPort : <%= request.getServerPort() %></span> <span><br>Path : <%= request.getRequestURI()%></span> </span> </body> </html>

Si el jsp se implementa en el servidor local y el acceso a este jsp devuelve 0: 0: 0: 0: 0: 0: 0: 1. Si accede a la aplicación localmente con IP, entonces devuelve IP.

RESTful web RESTful con Jersey

@javax.ws.rs.Path("/ip") public class GetIPInfo { @GET @Produces(MediaType.TEXT_PLAIN) public Response getIP(@Context javax.servlet.http.HttpServletRequest request) throws UnknownHostException { String remoteHost = request.getRemoteHost(); String remoteAddr = request.getRemoteAddr(); if (remoteAddr.equals("0:0:0:0:0:0:0:1")) { InetAddress localip = java.net.InetAddress.getLocalHost(); remoteAddr = localip.getHostAddress(); remoteHost = localip.getHostName(); } int remotePort = request.getRemotePort(); String msgoutput = remoteHost + " (" + remoteAddr + " : " + remotePort + ")"; return Response.status(200).entity(msgoutput).build(); } }

usando JavaScript para encontrar IP