日期:2014-05-20  浏览次数:20709 次

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。然后数字比较。

Java code

static Long toNumeric(String ip) {
        Scanner sc = new Scanner(ip).useDelimiter("\\.");
        return 
            (sc.nextLong() << 24) + 
            (sc.nextLong() << 16) + 
            (sc.nextLong() << 8) + 
            (sc.nextLong()); 
}