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