这些天正好工作时,需要用到这个功能,写完后还是觉得拿出来和大家分享下。。。
/**
* 判断访问者IP 是否符合规则
*
* @author ganjianwu @live.cn*
*/
public class ConversionIP {
/**
*
* @param ip
* 访问者IP
* @param configip
* ip规则,每个IP必须以逗号隔开
* @return
*/
public boolean conversion(String ip, String[] configip) {
boolean b = false;
String s = "*";
for (int i = 0; i < configip.length; i++) {
// 判断该个IP中是否存在“*”号
if (0 > configip[i].indexOf(s)) {
b = singleip(ip, configip[i]);
} else {
b = xinhaoip(ip, configip[i]);
}
if (b) {
break;
}
}
return b;
}
/**
* ip地址转成整数.
*
* @param ip
* 访问者ip
* @return
*/
public long ipTOlong(String ip) {
String[] longip = ip.split("[.]");
long num = 16777216 * Integer.parseInt(longip[0]) + 65536
* Integer.parseInt(longip[1]) + 256
* Integer.parseInt(longip[2]) + Integer.parseInt(longip[3]);
return num;
}
/**
* 单个ip段的ip限制
*
* @param ip
* 访问者ip
* @param configip
* ip规则,每个IP必须以逗号隔开
* @return
*/
public boolean singleip(String ip, String configip) {
boolean b = configip.equals(ip);
return b;
}
/**
* 区域段的ip限制,即带有“*”的ip段
*
* @param ip
* 访问者ip
* @param configip
* ip规则,每个IP必须以逗号隔开
* @return
*/
public boolean xinhaoip(String ip, String configip) {
boolean b = false;
long longip = ipTOlong(ip);
long ip_begin = ipTOlong(configip.replaceAll("//*", "1"));
long ip_end = ipTOlong(configip.replaceAll("//*", "255"));
if (ip_begin <= longip && ip_end >= longip) {
b = true;
}
return b;
}
}
其实只要注意一点,要搞明白IP是什么?其实IP就是一组32位的二进制,明白了这个就简单了,
我们就可以将IP转换为long,这样就可与你IP规则中的IP区段进行比较了。
大家如果有什么更好的办法,也可以告知于我。。。谢谢!!!