Как получить IP-адрес клиента в Java
В Java вы можете использоватьHttpServletRequest.getRemoteAddr()
, чтобы получить IP-адрес клиента, который обращается к вашему веб-приложению Java.
import javax.servlet.http.HttpServletRequest; String ipAddress = request.getRemoteAddr();
1. Прокси-сервер или Cloudflare
Для веб-приложения, которое находится за прокси-сервером, балансировщиком нагрузки или популярным решениемCloudflare, вы должны получить IP-адрес клиента через заголовок HTTP-запросаX-Forwarded-For (XFF).
import javax.servlet.http.HttpServletRequest; //... private static String getClientIp(HttpServletRequest request) { String remoteAddr = ""; if (request != null) { remoteAddr = request.getHeader("X-FORWARDED-FOR"); if (remoteAddr == null || "".equals(remoteAddr)) { remoteAddr = request.getRemoteAddr(); } } return remoteAddr; }
2. Не работает до сих пор?
Просмотрите заголовок HTTP-запроса клиента и попытайтесь определить, где хранится IP-адрес.
private MapgetRequestHeadersInMap(HttpServletRequest request) { Map result = new HashMap<>(); Enumeration headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String key = (String) headerNames.nextElement(); String value = request.getHeader(key); result.put(key, value); } return result; }
Примеры заголовков запросов для веб-приложений, стоящих за Cloudflare.
"referer" :"https://www.google.com/", "cf-ipcountry" :"US", "cf-ray" :"348c7acba8a02210-EWR", "x-forwarded-proto" :"https", "accept-language" :"en-US,en;q=0.8", "cookie" :"__cfduid=d3c6e5d73aa55b6b42fad9600c94849851490726068; _ga=GA1.2.450731937.1490726069", "x-forwarded-for" :"100.8.204.40", // <------ This is client real IP "accept" :"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "x-real-ip" :"108.162.219.236", // <------ This is cloudflare IP "x-forwarded-server" :"hostingcompass.com", "x-forwarded-host" :"hostingcompass.com", "cf-visitor" :"{\"scheme\":\"https\"}", "host" :"127.0.0.1:8080", "upgrade-insecure-requests" :"1", "connection" :"close", "cf-connecting-ip" :"100.8.204.40", "accept-encoding" :"gzip", "user-agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
Note
Обычно перед тем, как веб-сервер / прокси-сервер пересылает запрос на сервер приложений Java, он сохраняет реальный клиентский IP-запрос под стандартным именем заголовка, напримерx-forwarded-for
, если вы можете Не можете найти IP-адрес клиента во всех заголовках запроса, попробуйте обсудить его с администратором вашего сервера.