用于检查IPv4或IPv6地址是否在给定子网中的Java库

我可以用什么库来检查IP地址是否在给定的子网中? 我可以找到像Apache Commons SubnetUtils( SubnetUtils.SubnetInfo.isInRange )这样的库,但是许多库还不支持IPv6。

edazdarevic的CIDRUtils支持IPv4和IPv6。 该示例未提及boolean isInRange(String ipAddress),但它已实现!

另一种选择是java-ipv6 ,但它不支持IPv4并且需要JDK7 。

commons-ip-math支持IPv4和IPv6地址。 以下是检查IP地址是否在给定子网中的方法:

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 

(免责声明,我是commons-ip-math的维护者之一)

IPAddress Java库以多态方式支持IPv4和IPv6,并支持子网,包括检查子网中地址或子网包含的方法。 链接中提供了javadoc。

以下是解决您的问题的示例代码 ,它与IPv4或IPv6的工作方式相同。

使用Spring的IpAddressMatcher 。 与Apache Commons Net不同,它支持ipv4和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); } 

提示 :即使您没有使用Spring并且需要快速轻量级解决方案,您仍然可以使用此类,只需对源代码进行很少的修改(删除接口)。 ( 虽然这种方法不建议用于严肃的项目和/或如果您违反了他们的许可证 !