直接上代码:
此方法对于掩码为31、32不生效。掩码为31、32的可以特殊指定子网IP
private boolean validSingleSubnetMask(String subnetMask, String ip) { logger.info("开始校验ip是否属于子网。ip:{},子网:{}", ip, subnetMask); boolean flag = false; String[] subnetMasks = subnetMask.split("/"); String[] subnetIp = subnetMasks[0].split("\\."); String[] validIp = ip.split("\\."); Integer hostIpMask = Integer.parseInt(subnetMasks[1]); Integer remainder = hostIpMask % 8; Integer ipIndexRange = remainder == 0 ? 256 : 256 >> remainder;//ip子网在第几个地址允许的长度 for (int i = 1; i <= 4; i++) {//通过子网掩码长度,判断ip从什么地方开始需要校验 if (i * 8 > hostIpMask) { Integer subnetIpValue = Integer.parseInt(subnetIp[i-1]); Integer validIpIndex = Integer.parseInt(validIp[i-1]); for (int j = 0; j < (256/ipIndexRange); j++) { if (subnetIpValue >= ipIndexRange * j && subnetIpValue < ipIndexRange * (j + 1)) { logger.info("子网:"+subnetMask+" 子网允许的ip为:"+ ipIndexRange * j + "到:" + ipIndexRange * (j + 1)); if (validIpIndex > ipIndexRange * j && validIpIndex <= ipIndexRange * (j + 1) - 2) { logger.info("ip{}属于子网{}", ip, subnetMask); flag = true; break; } else { logger.info("ip{}不属于子网{}", ip, subnetMask); } } } break; } else { if (!validIp[i-1].equals(subnetIp[i-1])) {//前面ip开头不同,校验不通过 logger.info("ip{}不属于子网{}", ip, subnetMask); break; } } } return flag; }