2013-06-10 38 views

Odpowiedz

1

obsługuje zarówno IPv4, jak i IPv6 w sposób polimorficzny i obsługuje podsieci, w tym metody sprawdzające, czy w podsieci nie ma adresów lub podsieci. Jawadok jest dostępny pod linkiem.

Oto sample code, który rozwiązuje problem, który działa identycznie z IPv4 lub IPv6.

1

Użyj Spring's IpAddressMatcher. W przeciwieństwie do Apache Commons Net, obsługuje zarówno ipv4, jak i 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); 
} 

Podpowiedź: Nawet jeśli nie używasz wiosna i trzeba szybko lekkie rozwiązanie, można nadal korzystać z tej klasy, z bardzo małymi modyfikacjami (Odłączanie Interface) do source code. (Choć takie podejście nie jest zalecany do poważnych projektów i/lub jeśli naruszono ich license!)

1

commons-ip-math zapewnia wsparcie dla IPv4 i IPv6. Oto w jaki sposób można sprawdzić, czy adres IP jest w danej podsieci:

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 

(zrzeczenie się, że jestem jednym z opiekunów Gmin-IP-matematycznych)