Validar IP com java

23 respostas
D

olá pessoal

eu pretendo colocar no meu aplicativo um JTextField para que o
usuário insira um número de IP(ele vai ter que digitar os pontos e
tudo)… daí eu gostaria de pegar essa string e validar para ver se
o usuário não escreveu bobeira…
existe função em java que faz isso ?

bom, então é isso ! valeu !
Dennis

23 Respostas

L

Olá

Porque não usa métodos do servlet para pegar o IP do usuário ao invés de pedir para ele digitar? E se for aplicação desktop você pode pegar de vários modos, um deles com algo tipo ipconfig.

[]s
Luca

D

estou trabalhando como estagiário na programação de um jogo multiplayer
no servidor preciso configurar o IP do session host que fará
a ligação entre o servidor e o cliente… como pode existir
muitos session hosts, eu gostaria de poder digitar o ip do session host
para informar ao servidor onde o session host está

P

Ué, tu quer valdiar um IP?

if(segmento<0 || segmento>255) return false

faça um for para o número de segmentos da sua classe.

[]s

D

Faça uma expressão regular, acho que isso basta:

[0-9][0-9][0-9][.][0-9][0-9][0-9][.][0-9][0-9][0-9]

Tá tosco (pode ser melhorada), mas já ajuda.

D

oi danieldestro

eu sou completamente iniciante em java…
por isso gostaria que vc explicasse melhor como que usa
essa expressão regular

bom, é isso ! valeu !
Dennis

P

“danieldestro”:
Faça uma expressão regular, acho que isso basta:

[0-9][0-9][0-9][.][0-9][0-9][0-9][.][0-9][0-9][0-9]

Tá tosco (pode ser melhorada), mas já ajuda.

Uhm…aí tu permite 999.999.999.999

[]s

L

Olá

Agora que você explicou posso responder com mais certeza: a menos que seus clientes estejam atrás de um proxy não é necessário pedir que digitem o endereço IP. Você pode obter isto com facilidade usando o método getRemoteAddr da classe ServletRequest e armazenar esta informação no objeto session.

Atrás de proxies o negócio fica mais difícil, as vezes quase impossível. Alguns proxies completam o request com um header tipo “X-Forwarded” ou “X-Forward-IP” ou algo similar. Este header contém o IP “real”. Já se o cara estiver atrás de um proxy anônimo então babau. só perguntando mesmo e ele vai responder qq coisa menos o IP dele.

[]s
Luca

D

danieldestro,

consegui testar sua dica, usando a expressão regular

[0-2][0-5][0-5][.][0-2][0-5][0-5][.][0-2][0-5][0-5][.][0-2][0-5][0-5]

mas o problema é que ele não valida o ip se o usuário digitar
algo como 192.168.0.1, somente Ips como 255.255.255.255

bom, então é isso ! valeu !
Dennis

P

Denis, acho que o melhor é 0< IP =< 255 mesmo. Por regexp acho que nao dá.

[]s

D
import java.util.regex.*;

public class Teste {
  public static void main( String[] args ) {
	  String ip = "10.100.0.1";
	  String regex = "\d?\d?\d[.]\d?\d?\d[.]\d?\d?\d[.]\d?\d?\d";
	  Pattern pattern = Pattern.compile( regex );
	  Matcher matcher = pattern.matcher( ip );
	  if( matcher.matches() ) {
		  System.out.println( "IP válido" );
	  }

	  // na versã jdk 1.4.2
	  if( ip.matches( regex ) ) {
		  System.out.println( "IP válido" );
	  }
  }
}
P

“danieldestro”:
String regex = "d?d?d[.]d?d?d[.]d?d?d[.]d?d?d";

Imrpessão minha ou isso permitira 999.999.999.999 [não to com ambiente pra testar :frowning: ]?

[]s

D

“denakitan”:
danieldestro,

consegui testar sua dica, usando a expressão regular

[0-2][0-5][0-5][.][0-2][0-5][0-5][.][0-2][0-5][0-5][.][0-2][0-5][0-5]

mas o problema é que ele não valida o ip se o usuário digitar
algo como 192.168.0.1, somente Ips como 255.255.255.255

bom, então é isso ! valeu !
Dennis

tente usar interrogação, algo tipo:

[0-2]?[0-5]?[0-5][.][0-2]?[0-5]?[0-5][.][0-2]?[0-5]?[0-5][.][0-2]?[0-5]?[0-5]

pcalcado… aquel que eu postei vai aceitar 999 sim…

C

Yeap, permitiria. Destro, para de chutar cachorro morto! :smiley:

A regex mais “correta” que eu consegui pensar aqui seria:

(([0-1]?[0-9]{1,2}\.)|(2[0-4][0-9]\.)|(25[0-5]\.)){3}(([0-1]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))
D

hehehehe… minha abstração com regex não vai mto longe.

K

Livro bom sobre o assunto: http://guia-er.sourceforge.net/

Marcio Kuchma

J

Bom, deixa eu tentar tambem, preferiria criar uma regex mais simples como:

Pattern pattern = Pattern.compile("(\d{1,3}\.){3}\d{1,3}");
E se passar por ela usar o split para validar cada seguimento. No mais, se sua aplicação desktop vai pegar o endereço do host do cliente, o java.net.InetAddress resolve pra vc. Dá uma olhada nas docs. :wink:

valeuz…

I

Humm gostei da forma q o ganza fez…mas pow é via TextField a passagem de parâmetros né?Não fica as vezes mais fácil fazer um JFormattedTextField e receber cada pedacinho da máscara como uma stringzinha a ser tratada? (aí o primeiro exemplo do Philip seria o mais simples e tranquilo de se fazer!)

M

use este código:

InetAddress host;

try {

host = ip;

}

catch(UnknownHostException uhex) {

System.out.println(Host Inválido);

}
J

Pessoal,

fiz um método estático que me serviu. Espero que ajude vocês.

/**
     * Verifica se um endereço IP é válido
     * @param ipAddress String contendo o endereço IP a ser testado
     * @return TRUE caso o IP seja válido e FALSE caso seja inválido
     */
    public static boolean isEnderecoIpValido(String ipAddress)  {
        
        //Checa se o comprimento da string é menor que 6 e maior que 15
        //Minimo 1.1.1.1 Máximo 255.255.255.255
        if (ipAddress.length()<6 || ipAddress.length()>15)   {
            return false;
        }
        
        //Quebrando a string em array pelo símbolo . deve ser gerado um array 
        //com 4 itens
        String[] itens = ipAddress.split(".");
        
        if (itens.length != 4)  {
            return false;
        }
        
        boolean retorno = true;
        try {
            for (String item: itens)    {
                if (Integer.parseInt(item)<1 || Integer.parseInt(item)>255) {
                    retorno = false;
                }
            }
        //Exception capsulada pois o objetivo do método é só testar o endereço    
        } catch (NumberFormatException ex)  {
            retorno = false;
        }
        
        return retorno;

    }

Abs!

Jefferson

R

No seu código… na linha 10, o minimo seria 7 não??

4 numeros de 1 digito + 3 pontos(".") = 7, nao 6!

J

root_:
No seu código… na linha 10, o minimo seria 7 não??

4 numeros de 1 digito + 3 pontos(".") = 7, nao 6!

Perfeito! Você tem razão. É por isso que eu acredito no pair programming.
O que você acha de copiar meu código acima e postar novamente com essa refatoração? Assim ficará um exemplo corrigido para outra pessoa poder usar.

Parabéns pela iniciativa e obrigado pelo aviso!

Um abraço.

R

CÓDIGO DO JEFFPRESTES COM ALGUMAS MODIFICAÇOES ( JA A SUPORTAR SITUAÇAO DE IPV6 E TAMANHO MÍNIMO CORRIGIDO )

// valida um ip IPV4/IPV6
    public static boolean dtv_ValidaIp(String ip, int IPV)
    {
        String[] ipSplit = {""};
        switch(IPV)
        {
            case IPV4:
                //Minimo 1.1.1.1 Máximo 255.255.255.255
                if(ip.length()<7 || ip.length()>15)
                    return false;
                ipSplit = ip.split(".");
                if(ipSplit.length!=4)
                    return false;
            break;
            case IPV6:
                //Minimo 1.1.1.1.1.1 Máximo 255.255.255.255.255.255
                if(ip.length()<11 || ip.length()>23)
                    return false;
                ipSplit = ip.split(".");
                if(ipSplit.length!=6)
                    return false;
            break;
        }

        try
        {
            for (String ipContext: ipSplit)
                if (Integer.parseInt(ipContext)<1 || Integer.parseInt(ipContext)>255)
                    return false;

        }
        catch(NumberFormatException ex)
        {
            return false;
        }

        return true;
    }

Abraços…

A

Substituir as linhas 11 e 19 por:

ipSplit = ip.split("\.");

abs

Criado 9 de junho de 2004
Ultima resposta 15 de set. de 2009
Respostas 23
Participantes 12