Какой правильный способ получить запрос ip

Я нахожу несколько разных способов получить ip в сервлет. но я не знаю, какой из них прав и почему.

1:

request.getHeader( "X-Real-IP" )

2:

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

3:

 String ip=request.getHeader("x-forwarded-for");
                if(ip==null){
                    ip=request.getRemoteAddr();
                }
                String ips[]=ip.split(",");`
                                ip=ips[0];

Ответ 1

Ответ сложный.

  • Если ваш сервлет работает на веб-сервере, который находится за обратным прокси-сервером или балансировщиком нагрузки, тогда этот веб-прокси можно настроить для ввода заголовка запроса, который дает IP-адрес, с которого пришел запрос. Различные обратные прокси будут вводить разные заголовки. Обратитесь к документации для вашего (front-end) сервера.

  • Если ваш клиент использует прокси-сервер (forward), он может вставлять заголовки, чтобы сказать, что такое IP-адрес клиента... или это может быть не так. И IP-адрес, который он вставляет, может быть неправильным.

  • Значение, которое вы получаете при вызове request.getRemoteAddr(), будет IP-адресом непосредственного источника запроса.

Ни один из перечисленных вами заголовков не является стандартным, но считается, что "x-forwarded-for" является стандартом defacto; то есть именно тот, который, скорее всего, будет вставлен прокси и т.д., если что-то вводится.

Наконец, даже если вы получили IP-адрес, это не обязательно поможет вам. Например, если клиент находится в частной сети и подключается к Интернету через NAT-шлюз, тогда IP-адрес в HTTP-запросе будет адресом NAT-сервера... не фактическим IP-адресом клиента.


Итак, что это значит? В общем, это означает, что в целом вы не можете надежно узнать IP-адрес системы, из которого возник запрос.

Ответ 2

Это похоже на то, что мы можем сделать, чтобы получить исходный IP-адрес клиента

String ipAddress = request.getHeader("X-FORWARDED-FOR");  
if (ipAddress == null) {  
   ipAddress = request.getRemoteAddr();  
}