java IP 地址比较
现在的需求是这样的,服务器上记录一段IP地址, 我要用客户端请求的IP地址来校验是否满足我的服务器上IP段,如果满足继续后面的操作,不满足就过滤掉,不知道有什么办法,只想出来一种办法:
String startIp = "192.168.15.101"; //服务器上允许的开始IP
String endIp = "192.168.25.115"; //服务器上允许的结束IP
Long long_startIp = new Long(String.valueOf(startIp.replace(".", "")));
Long long_endIp = new Long(String.valueOf(endIp.replace(".", "")));
String tmp = "192.168.21.100"; //客户端请求的IP
Long long_tmp = new Long(String.valueOf(tmp.replace(".", "")));
if (long_tmp >= long_startIp && long_tmp <= long_endIp) {
logger.debug("满足");
} else {
logger.debug("不满足");
}
不知道这种方法有什么弊端,或者有更好的办法 !!!!!
[解决办法]
弊端是很明显的,你区分不出:
192.168.1.123 和 192.168.11.23 以及 192.168.112.3
比较好的做法是,将其转为一个 long 型数值,然后直接数值比较。
如果你注意到的话,其实恰好就是 8bit:8bit:8bit:8bit
处理也不复杂,自己定义一个函数就是了:
String[] ips = startIp.split("\\.");
long n = 0;
for (int i=0; i<ips.length; i++) {
n = n<<8 + Integer.parseInt(ips[i]);
}
然后直接用数值比较就差不多了。
如果要更完美点,就检测下IP地址的合规性,不要出现:192.168.1123.0 之类的
[解决办法]
ip.replaceAll("(\\d+)", "00$1");//在ip的每个段上加俩0
ip.replaceAll("0*(\\d{3})", "$1");//保留后三位
String[] ips = ip.split(".");
然后比较各个数组元素的值是否在你规定的ip范围内,下面就简单了吧
String startIp = "192.168.15.101";
String endIp = "192.168.25.115";
[解决办法]
ipv4的话,转成long。然后数字比较。
static Long toNumeric(String ip) { Scanner sc = new Scanner(ip).useDelimiter("\\."); return (sc.nextLong() << 24) + (sc.nextLong() << 16) + (sc.nextLong() << 8) + (sc.nextLong()); }