Подтвердить что ты не робот

Получите реальный IP-адрес клиента в сервлете

У меня проблемы с простой проблемой. Я бы получил IP-адрес реального клиента внутри HTTPServlet.

С тех пор я использовал:

request.getRemoteAddr()

Но теперь он возвращает ложный IP. например: xxx.xxx.xxx. 50, но мой IP-адрес похож на xxx.xxx.xxx. 159. (отмечено в http://whatismyipaddress.com/).

Теперь я попытался использовать:

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

Он возвращает NULL.

Я также взял пробку со следующим классом:

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

Он также вернул xxx.xxx.xxx.50 IP.:(

Теперь я не знаю, как получить реальный IP-клиент. Если кто-то знает решение, пожалуйста, ответьте.

4b9b3361

Ответ 1

Я полагаю, что ваша проблема в том, что вы используете сервер где-то в локальной сети, поэтому вы получаете свой IP-адрес в этой сети. Однако, когда вы пытаетесь использовать онлайн-сервис, который обнаруживает ваш IP-адрес, ваш IP-адрес IP-адреса вашего маршрутизатора поставщика услуг или что-то в этом роде. Использование request.getRemoteAddr() верное. Это то, что делают такие службы, и у них нет других объектов.

Ответ 2

Когда у вас есть устройство NAT (Network Address Translation) перед вашим контейнером сервлета request.getRemoteAddr() возвращает адрес NAT, так как он инициирует новое соединение.

Чтобы решить вашу проблему, вы должны настроить NAT для отправки в заголовок IP исходного клиента. Затем, чтобы взять заголовок из запроса. Если вы сконфигурируете в заголовке NAT X-Forwarded-For, используйте этот код: request.getHeader("X-Forwarded-For")

Вы правильно работаете, его можно использовать при настройке NAT.

Ответ 3

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>

Если jsp развернут на локальном сервере и доступ к этому jsp возвращает 0: 0: 0: 0: 0: 0: 0: 1. Если доступ к приложению локально с ip, то он возвращает IP.

RESTful Веб-сервисы с Джерси

@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(); 
    }
}

используя JavaScript, чтобы найти IP