Jaką bibliotekę mogę użyć do sprawdzenia, czy adres IP znajduje się w danej podsieci? Mogłem znaleźć biblioteki takie jak Apache Commons SubnetUtils (SubnetUtils.SubnetInfo.isInRange), ale wiele nie obsługuje jeszcze IPv6.Biblioteka Java, aby sprawdzić, czy adres IPv4 lub IPv6 znajduje się w danej podsieci
Odpowiedz
edazdarevic's CIDRUtils obsługuje zarówno IPv4, jak i IPv6. W przykładzie nie wymieniono boolean isInRange (String ipAddress), ale jest zaimplementowany!
Inną opcją jest java-ipv6, ale nie obsługuje ona IPv4 i requires JDK7.
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.
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!)
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)
Commons żądania cecha netto do głosuj na: https://issues.apache.org/jira/browse/NET-405 – Vadzim