IP白名单校验
程序员文章站
2022-05-18 20:25:15
...
支持格式:
1、127.0.0.1 // 指定固定IP
2、127.0.0.1-127.0.0.128 // 可使用“-”来表示一个IP区间,支持跨IP段(一般不会出现这种情况,跨IP段则配置多个规则)
3、127.0.* // 2~4位IP段可配置为"*"
注意:“*” 和“-”不允许共存
限制:仅支持ipv4格式的IP,不允许以“localhost”方式访问
方式:将ip值补全为12位并转为Long类型,再进行比较
/**
* Auther: Charles.Chen <br>
* Description: IP 白名单校验
* Date: Create in 18:00 2018/6/19
**/
public class IpWhiteListVerify {
private static Pattern pattern = Pattern
.compile("(1\\d{1,2}|2[0-4]\\d|25[0-5]|\\d{1,2})\\." + "(1\\d{1,2}|2[0-4]\\d|25[0-5]|\\d{1,2})\\."
+ "(1\\d{1,2}|2[0-4]\\d|25[0-5]|\\d{1,2})\\." + "(1\\d{1,2}|2[0-4]\\d|25[0-5]|\\d{1,2})");
/**
* 检查白名单格式是否正确
* @param ip
* @return
*/
public static boolean verifyFormat(String ip) {
if(ip == null || ip.trim().length() == 0) {
return false;
}
ip = ip.trim();
int allIndex = ip.indexOf("*");
int separateIndex = ip.indexOf("-");
if(allIndex >= 0 && separateIndex >= 0) {
return false;
}
if(allIndex > 0) {
int paddingLength = 4 - ip.split("\\.").length;
for(int i=0; i<paddingLength; i++) {
ip += ".0";
}
ip = ip.replace("*", "0");
}
String[] temp = ip.split("-");
for (String s : temp) {
if (!pattern.matcher(s).matches()) {
return false;
}
}
return true;
}
/**
* 检查IP是否属于白名单范围
* @param ip
* @param ipList
* @return
*/
public static boolean verifyIp(String ip, List<String> ipList) {
if(ipList == null || ipList.size() == 0) {
return true;
}
for(String ips : ipList) {
if(ips.indexOf("-") > 0) {
String[] ipInterval = ips.split("-");
if(isContains(ip, ipInterval[0], ipInterval[1])) {
return true;
}
} else {
if(isContains(ip, ips, ips)) {
return true;
}
}
}
return false;
}
private static boolean isContains(String ip, String startIp, String endIp) {
Long ipValue = ipConversionToLong(ip, true);
Long startIpValue = ipConversionToLong(startIp, true);
Long endIpValue = ipConversionToLong(endIp, false);
if(ipValue >= startIpValue && ipValue <= endIpValue) {
return true;
}
return false;
}
private static Long ipConversionToLong(String ip, boolean isStart) {
String[] ipPassages = ip.split("\\.");
int ipPassagesLength = ipPassages.length;
String ipValue = "";
for(int i=0; i<4; i++) {
if(i < ipPassagesLength) {
String ipPassage = ipPassages[i];
if("*".equals(ipPassage)) {
ipValue += isStart ? "000" : "255";
} else {
ipValue += paddingZero(ipPassage);
}
} else {
ipValue += isStart ? "000" : "255";
}
}
return Long.parseLong(ipValue);
}
private static String paddingZero(String value) {
int paddingZeroLength = 3 - value.length();
for(int i=0; i<paddingZeroLength; i++) {
value = "0" + value;
}
return value;
}
}
转载于:https://my.oschina.net/clyy/blog/1832637
上一篇: rsyslog过滤关键字
下一篇: 用户注册——关键字过滤