2013-06-10 10 views

risposta

1

The IPAddress Java library supporta sia IPv4 che IPv6 in modo polimorfico e supporta le sottoreti, inclusi i metodi che controllano il contenimento di un indirizzo o sottorete in una sottorete. Il javadoc è disponibile al link.

Questo è sample code che risolve il problema, che funziona in modo identico con IPv4 o IPv6.

1

Utilizzare Spring's IpAddressMatcher. A differenza di Apache Commons Net, supporta sia ipv4 che ipv6.

private void checkIpMatch() { 
    matches("192.168.2.1", "192.168.2.1"); // true 
    matches("192.168.2.1", "192.168.2.0/32"); // false 
    matches("192.168.2.5", "192.168.2.0/24"); // true 
    matches("92.168.2.1", "fe80:0:0:0:0:0:c0a8:1/120"); // false 
    matches("fe80:0:0:0:0:0:c0a8:11", "fe80:0:0:0:0:0:c0a8:1/120"); // true 
    matches("fe80:0:0:0:0:0:c0a8:11", "fe80:0:0:0:0:0:c0a8:1/128"); // false 
    matches("fe80:0:0:0:0:0:c0a8:11", "192.168.2.0/32"); // false 
} 

private boolean matches(String ip, String subnet) { 
    IpAddressMatcher ipAddressMatcher = new IpAddressMatcher(subnet); 
    return ipAddressMatcher.matches(ip); 
} 

Suggerimento: Anche se non si sta usando la primavera e hai bisogno di una soluzione rapida leggera, è ancora possibile utilizzare questa classe con molto piccole modifiche (rimuovendo l'interfaccia) al source code. (Anche se questo approccio non è raccomandato per i progetti seri e/o se si sta violando la loro license!)

1

commons-ip-math fornisce il supporto per IPv4 e indirizzi IPv6. Ecco come è possibile verificare se un indirizzo IP è in una data sottorete:

Ipv4Range.parse("192.168.0.0/24").contains(Ipv4.parse("10.0.0.1")) 
// false 

Ipv6Range.parse("2001:db8::/32").contains(Ipv6.parse("2001:db8::4")) 
// true 

(dichiarazione di non responsabilità, io sono uno dei manutentori di commons-ip-matematica)

Problemi correlati