i följande handledning visar vi dig hur du kan få klientens IP-adress med servlet-specifikationen. Vi diskuterar vad du kan göra om din klient står bakom en proxy eller gateway. Vi förklarar varför denna IP-adress inte alltid är säker att använda.
klientens IP-adress
i java kan du komma åt klientens IP-adress via Servlets request.getRemoteAddr()
.
String ipAddress = request.getRemoteAddr();
men detta svar är långt ifrån fullständigt och är ganska komplicerat.
Proxies, Gateways … Pålitlig, Säker?
om ditt program körs på en webbserver som ligger bakom en omvänd proxy eller lastbalanserare, kan den proxyn konfigureras för att injicera den begärda IP-adressen i en förfrågningshuvud. Olika omvända proxyservrar kan injicera olika rubriker. Se dokumentationen för din proxyserver. Vi listade ett par av de mest använda i vårt exempel nedan men det är inte alls en komplett lista.
- när din klient använder en (framåt) proxy kan den infoga rubriker för att säga vad klientens IP-adresser är. Eller det kanske inte. Och IP-adressen som infogas här kan vara felaktig.
- det betyder att värdet du får genom att ringa
request.getRemoteAddr()
är IP-adressen till den omedelbara uppströmskällan för begäran. - som vi sa finns det många rubriker för olika proxyer som används, men
x-forwareded-for
kommer sannolikt att infogas av en proxy.
som en sista anteckning, även om du får en IP-adress antingen från rubriken eller från request.getRemoteAddr()
är det inte garanterat att vara klientens IP-adress. T. ex.: om din proxy inte innehåller klientens IP-adress får du IP-adressen till proxy-eller lastbalansern. Om din klient arbetar på ett privat nätverk och ansluter till internet via en nat-gateway, kommer IP-adressen i HTTP-begäran att vara en adress till NAT-servern. Eller till och med för en hacker är det ganska lätt att injicera en rubrik med en annan IP-adress. Så det betyder att du inte på ett tillförlitligt sätt kan ta reda på IP-adressen för systemet som begäran härstammar från.
få klient IP-adress
private static final String IP_HEADER_CANDIDATES = { "X-Forwarded-For", "Proxy-Client-IP", "WL-Proxy-Client-IP", "HTTP_X_FORWARDED_FOR", "HTTP_X_FORWARDED", "HTTP_X_CLUSTER_CLIENT_IP", "HTTP_CLIENT_IP", "HTTP_FORWARDED_FOR", "HTTP_FORWARDED", "HTTP_VIA", "REMOTE_ADDR" };public static String getClientIpAddress(HttpServletRequest request) { for (String header : IP_HEADER_CANDIDATES) { String ip = request.getHeader(header); if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) { return ip; } } return request.getRemoteAddr();}