Como faço para obter o endereço remoto de um cliente no servlet?

Existe alguma maneira que eu poderia obter o endereço IP original do cliente chegando ao servidor? Eu posso usar request.getRemoteAddr() , mas eu sempre consigo obter o IP do proxy ou o servidor web.

Eu gostaria de saber o endereço IP que o cliente está usando para se conectar a mim. Existe alguma maneira que eu poderia conseguir?

tente isto:

 public static String getClientIpAddr(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.getHeader("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; } 

request.getRemoteAddr() é o caminho. Parece que seu proxy muda o IP de origem. Quando alguns proxies fazem isso, eles adicionam o IP original em algum header http personalizado. Use request.getHeaderNames() e request.getHeaders(name) e imprima todos eles para ver se não há nada de interesse. Como X-CLIENT-IP (fez isso, mas eles se parecem com isso)

Você não pode fazer isso de maneira significativa.

O proxy pode ou não adicionar um header proxied-to, mas em muitos casos este será um endereço interno de qualquer maneira, então será sem sentido para você. A maioria dos proxies na borda de uma organização é configurada para revelar o mínimo possível sobre os internos da rede.

O que você pretende usar esta informação?

A melhor solução que já usei

 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; } 

Como isso geralmente é um problema de implantação, em vez de um problema de aplicativo, outra abordagem seria configurar o contêiner de aplicativo apropriadamente. Uma vez configurado, o contêiner se encarrega de inspecionar o header apropriado e seu aplicativo continua a usar request.getRemoteAddr() .

Por exemplo, no Tomcat, você pode usar a Válvula IP Remota . Eu diria que a maioria dos servidores de aplicativos tem funcionalidade semelhante.

O contêiner também poderia compreender se seu balanceador de carga front-end está encerrando as conexões SSL, encaminhando a solicitação ao servidor de aplicativos via HTTP. Isso é importante quando seu aplicativo precisa gerar URLs para si mesmo.

 String ipAddress = request.getHeader("x-forwarded-for"); if (ipAddress == null) { ipAddress = request.getHeader("X_FORWARDED_FOR"); if (ipAddress == null){ ipAddress = request.getRemoteAddr(); } } 

O header de solicitação “x-forwarded-for” contém o IP do cliente original, se estiver usando um proxy ou um balanceador de carga. Mas acho que nem todos os proxies / lb adicionam este header.

Aqui está um código java para analisar o header: http://www.codereye.com/2010/01/get-real-ip-from-request-in-java.html

Se esse header não estiver presente, eu prosseguirei como o @Bozho sugere

 InetAddress inetAddress = InetAddress.getLocalHost(); String ip = inetAddress.getHostAddress();