Какой правильный способ получить 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];

2 ответа

Решение

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

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

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

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

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

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


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

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

String ipAddress = request.getHeader("X-FORWARDED-FOR");  
if (ipAddress == null) {  
   ipAddress = request.getRemoteAddr();  
}
Другие вопросы по тегам