В JSP метод получения IP-адреса клиента: request.getRemoteAddr(). Этот метод эффективен в большинстве случаев. Однако реальный IP-адрес клиента невозможно получить с помощью программного обеспечения обратного прокси, такого как Apache и Squid. Если используется программное обеспечение обратного прокси, IP-адрес, полученный с помощью метода request.getRemoteAddr(), будет: 127.0.0.1 или 192.168.1.110, а не реальный IP-адрес клиента.
После прохождения через прокси, поскольку между клиентом и сервисом добавляется промежуточный уровень, сервер не может напрямую получить IP-адрес клиента, а серверное приложение не может напрямую вернуть клиенту адрес перенаправленного запроса. Однако информация X-FORWARDED-FOR добавляется к информации HTTP-заголовка пересылаемого запроса. Используется для отслеживания исходного IP-адреса клиента и адреса сервера, запрошенного исходным клиентом. Когда мы обращаемся к index.jsp/, на самом деле не наш браузер обращается к файлу index.jsp на сервере. Вместо этого прокси-сервер сначала обращается к index.jsp, а прокси-сервер возвращает нам полученные результаты. поскольку прокси-сервер обращается к index.jsp, IP-адрес, полученный с помощью метода request.getRemoteAddr() в index.jsp, на самом деле является адресом прокси-сервера, а не IP-адресом клиента.
Итак, мы можем придумать первый метод получения реального IP-адреса клиента:
общественная строка getRemortIP (запрос HttpServletRequest) {
if (request.getHeader("x-forwarded-for") == null) {
вернуть запрос.getRemoteAddr();
}
return request.getHeader("x-forwarded-for");
}
Способ 2 для получения реального IP-адреса клиента:
общественная строка getIpAddr (запрос HttpServletRequest) {
String ip = request.getHeader("x-forwarded-for");
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Прокси-Клиент-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();
}
вернуть IP;
}
Однако если передается многоуровневый обратный прокси-сервер, значение X-Forwarded-For будет не одним, а серией значений IP. Какое из них является реальным IP-адресом реального клиента?
Ответ заключается в том, чтобы взять первую неизвестную действительную строку IP в X-Forwarded-For. нравиться:
X-Перенаправлено-Для: 192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
Реальный IP пользователя: 192.168.1.110.