Pegar IP Externo do usuário acessando aplicação WEB?

Estou precisando de ajuda de vocês para descobrir o IP externo do usuário que está acessando nossa aplicação web, uso JAVA + JSF.

Estava usando este métodos, mas descobri que ele retorna sempre o IP interno:

public static String retornIp() {
        HttpServletRequest request = (HttpServletRequest) FacesContext
                .getCurrentInstance().getExternalContext().getRequest();
        String ip = request.getRemoteAddr();
        System.out.println(ip);
        return ip;
}

Procurei na Internet e encontrei estas 2 classes que trabalham em conjunto:

1ª)

public class PegandoIps {         
      
    String ipLocal = "";  
    String ipExterno = "";  
    String linhas = null;  
    Matcher m;  
  
    String ipMaquina(){                               
         try{             
            InetAddress end = InetAddress.getLocalHost();  
            ipLocal = end.getHostAddress().toString();                      
            URL url = new URL(new VerificaSite().verificandoSite());  
            HttpURLConnection conexao = (HttpURLConnection) url.openConnection();  
            BufferedReader buffer = new BufferedReader(new InputStreamReader(conexao.getInputStream()));  
            Pattern pega = Pattern.compile("[0-9]{1,3}[.-]{1}[0-9]{1,3}[.-]{1}[0-9]{1,3}[.-]{1}[0-9]{1,3}");  
            while((linhas = buffer.readLine()) != null){  
                m = pega.matcher(linhas);  
                while(m.find()){  
                    ipExterno = m.group();  
                  }  
              }  
            buffer.close();  
            conexao.disconnect();  
        } catch(MalformedURLException e1){  
                System.exit(1);  
        }catch(IOException e2){  
                System.exit(1);  
            } 
         return ipExterno.replace("-", ".");  
    } 
}

2ª)

public class VerificaSite     
 public String verificandoSite(){  
          
        String[] site = {"http://www.meuenderecoip.com", "http://meuip.datahouse.com.br",   
                         "http://www.hlera.com.br/meu_ip/", "http://www.abusar.org.br",  
                         "http://www.mostrarip.com.br"};  
        String siteValido = "";  
        for(int i = 0; i < site.length; i++){    
            try {  
                URL url = new URL(site[i]);  
                HttpURLConnection conexao = (HttpURLConnection) url.openConnection();  
  
                int codigo = conexao.getResponseCode();  
                if(codigo == 200){  
                    siteValido = site[i];  
                  }  
            } catch (Exception e) {  
                   }  
        }  
        return siteValido;  
    }  
}

Como o Java está fazendo a conexão com os sites, está gravando sempre o nosso IP no banco de dados.Será que alguém pode me dar uma luz?

Ninguém?

vamos la

se a sua aplicação roda sob um load balancer ou algo do tipo, então vc vai ver um ip interno.

em geração um proxy ou load balancer vai adicionar um header ‘X-FORWARDED-FOR’ ou algo do tipo com o ip real.

vc precisa fazer esse tipo de verificação:

String ipAddress = request.getHeader("X-FORWARDED-FOR");
if (ipAddress == null) {
	   ipAddress = request.getRemoteAddr();
}

as classes q vc mostrou eu não entendi o proposito delas, parece outra coisa.

Bom dia amigo,

Eu alterei o primeiro método e acrescentei esta verificação, está me retornando o IP Interno da máquina, preciso que me retorne o IP Externo do usuário que está acessando o sistema. As 2 classes que enviei, o Java faz uma conexão nos sites, mas, como é o servidor, está sempre retornando o nosso IP.
Se tivesse alguma javaScript que fizesse isso.

tem algo que nao faz sentido ai. o que vc chama de ip externo do usuario? esse cara esta dentro de uma intranet de vcs ou ele esta em outro lugar ( na casa dele por exemplo )?

se ele esta dentro de uma intranet, provavelmente ele acessa a internet atraves de um proxy / NAT e talvez esse ip não seja relevante.

descreve o seu problema um pouco melhor, por favor.

Caro amigo, desculpe a demora, então vamos lá.
o Ip Externo que eu falo é em outro lugar, são os usuários que acessam nossa aplicação web via IP.