需要能够检查 128.23.51.58、128.23.*.*、128.23.[51-58].* 和 128.23.[51,52,53].* 的支持。
import java.util.ArrayList;
import java.util.List;
public class IPWhitelist {
private List<String> whitelist;
public IPWhitelist() {
whitelist = new ArrayList<>();
}
public void addToWhitelist(String ipAddress) {
whitelist.add(ipAddress);
}
public boolean isIPAllowed(String ipAddress) {
for (String whitelistEntry : whitelist) {
if (isIpMatching(ipAddress, whitelistEntry)) {
return true;
}
}
return false;
}
private boolean isIpMatching(String ipAddress, String whitelistEntry) {
String[] ipAddressParts = ipAddress.split("\\.");
String[] whitelistEntryParts = whitelistEntry.split("\\.");
if (ipAddressParts.length != whitelistEntryParts.length) {
return false;
}
for (int i = 0; i < ipAddressParts.length; i++) {
String ipAddressPart = ipAddressParts[i];
String whitelistEntryPart = whitelistEntryParts[i];
if (whitelistEntryPart.equals("*")) {
continue;
}
if (whitelistEntryPart.startsWith("[") && whitelistEntryPart.endsWith("]")) {
String whitelistContent = whitelistEntryPart.substring(1, whitelistEntryPart.length() - 1);
String[] whitelistValues = whitelistContent.split(",");
boolean matchFound = false;
for (String value : whitelistValues) {
value = value.trim();
if (value.contains("-")) {
String[] rangeBounds = value.split("-");
if (rangeBounds.length != 2) {
continue;
}
int startRange = Integer.parseInt(rangeBounds[0].trim());
int endRange = Integer.parseInt(rangeBounds[1].trim());
int ipPart = Integer.parseInt(ipAddressPart.trim());
if (ipPart >= startRange && ipPart <= endRange) {
matchFound = true;
break;
}
} else {
int whitelistValue = Integer.parseInt(value.trim());
int ipPart = Integer.parseInt(ipAddressPart.trim());
if (ipPart == whitelistValue) {
matchFound = true;
break;
}
}
}
if (!matchFound) {
return false;
}
} else {
int whitelistValue = Integer.parseInt(whitelistEntryPart.trim());
int ipPart = Integer.parseInt(ipAddressPart.trim());
if (ipPart != whitelistValue) {
return false;
}
}
}
return true;
}
public static void main(String[] args) {
IPWhitelist whitelist = new IPWhitelist();
whitelist.addToWhitelist("128.23.[51-58].*");
whitelist.addToWhitelist("128.23.[51,52,53].*");
String ipAddress1 = "192.168.0.42";
String ipAddress2 = "128.23.55.100";
String ipAddress3 = "128.23.50.52";
System.out.println(whitelist.isIPAllowed(ipAddress1)); // false
System.out.println(whitelist.isIPAllowed(ipAddress2)); // true
System.out.println(whitelist.isIPAllowed(ipAddress3)); // true
}
}