0

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

10

Проблема с получением 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 ответ(ов)

0

Вы можете попробовать следующий код для получения 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-адрес клиента, даже если он находится за прокси.

0

Как уже упоминал 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.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь