Получение IP-адреса клиента
Проблема с получением IP-адреса клиента в Java Servlet
Я разрабатываю веб-приложение, используя JSP и Servlets (контейнер: Glassfish), в котором мне нужно получить IP-адрес клиента.
Основная причина, по которой я хочу получить IP-адрес клиента, заключается в необходимости ограничить доступ к некоторым страницам (например, формам обслуживания клиентов) только с компьютеров, находящихся в офисе, и запретить доступ к этим страницам извне.
Вот мой код на данный момент:
Способ 1
String ipAddress = request.getRemoteAddr();
System.out.println("IP Address: " + ipAddress);
Способ 2
String ipAddress = null;
String getWay = request.getHeader("VIA"); // Шлюз
ipAddress = request.getHeader("X-FORWARDED-FOR"); // прокси
if (ipAddress == null) {
ipAddress = request.getRemoteAddr();
}
System.out.println("IP Address: " + ipAddress);
Однако, указанный выше код каждый раз после перезагрузки компьютера (выключение → включение или перезагрузка) возвращает разные IP-адреса.
В результате я получаю IP-адрес в формате IP6, например:
fe80:0:0:0:20ca:1776:f5ff:ff15%13
Что может быть не так с этим кодом? Как я могу получить постоянный внешний IP-адрес клиента?
2 ответ(ов)
Вы можете попробовать следующий код для получения IP-адреса из объекта HttpServletRequest
:
public String getIpAddr(HttpServletRequest request) {
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.getRemoteAddr();
}
return ip;
}
Этот метод проверяет несколько HTTP-заголовков, которые могут содержать IP-адрес клиента. Сначала он пытается получить адрес из заголовка x-forwarded-for
, который часто используется в прокси-серверах. Если этот заголовок отсутствует или не содержит действительного адреса, код последовательно проверяет другие заголовки, такие как Proxy-Client-IP
и WL-Proxy-Client-IP
. Если ни один из них не возвращает подходящий IP-адрес, метод просто берет IP-адрес напрямую с помощью request.getRemoteAddr()
.
Таким образом, данный подход позволяет корректно определять IP-адрес клиента, даже если он находится за прокси.
Как уже упоминал basZero, поле X-Forwarded-For следует проверять на наличие запятых. Подробности можно найти по ссылке: http://en.wikipedia.org/wiki/X-Forwarded-For. Общий формат данного поля выглядит следующим образом: X-Forwarded-For: clientIP, proxy1, proxy2 и так далее. Таким образом, вы будете встречать что-то вроде: X-FORWARDED-FOR: 129.77.168.62, 129.77.63.62.
Как работают сервлеты? Инстанцирование, сессии, общие переменные и многопоточность
Как распределяются потоки для обработки запросов Servlet?
Как заставить браузер скачать файл?
Как реализовать пагинацию в Spring MVC 3 [закрыто]
Юнит-тестирование Java Servlet