What/Where/Why:一般我们在论坛bbs上经常会看到一些封号的。情节严重的,版主会封锁该用户的所在地区的ip,使之无法登录,也会看到一些bbs的签名上有显示你当前用户所在地ip以及地区信息的,这个技术一般就是用在这里。而我主要用在一个投票的小模块中,用于判断该用户ip是否进行重复投票的时候使用,这里我只提供了一个工具类代码,而地区ip段我没有搜集,以后有时间了再整理。
How:一个用户的ip,类似于”221.8.65.74”,而一般我们在java中存储于数据库,并不是把这个值当作字符串存储,是当作long类型存储。如何转化long类型呢,这里就应该介绍下ip地区段位的说法。
在互联网中,各用户都是通过ip来区分的,不同地区的ip有它们自己的ip区间,我们可以把用户ip比喻为电话号码,而区间,则表示电话号码中的区号,比如上面所说的”221.8.65.74”ip,它是属于吉林省的,因为吉林省的ip段是3 708 289 023 到 3 708 420 094,一个ip地址是由4个段位组成,分别用“.”来区分,而区间号呢,则是ip转化为整数后的一个整数区间,上面的地址,转化为整数后是“3 708 305 738”,它在吉林省的区间段,所以属于吉林,下面就介绍如何转化为整数。
这里的转化,我们就需要用到位移运算来解释了,我们需要把ip地址中的每个段位转化为8位的二进制数,不足8位的,要用0来补足,然后依次把这4个段位依次首尾相连,得到一个新的二进制数,然后把这个二进制数转化为十进制数,即可。举例:221.8.65.74,括号内为对应的二进制,分为221(11011101)、8(00001000)、65(01000001)、74(01001010),然后首尾相连得到11011101 00001000 01000001 01001010,转化为十进制后得到3 708 305 738。用代码表示:
public static long getIpNum(String ip){
long ipNum = 0;
if(ip != null && ip.trim().length() != 0){
String [] subips = ip.split("\\.");
for(String str : subips){
//向左移8位
ipNum = ipNum << 8;
ipNum += Integer.parseInt(str);
}
}
return ipNum;
}
总结:这个转化是在一本书上看的,感觉以后应该有用,记下备忘,代码的实现比较简单,没多大的技术含量,主要还是理解它的生成方式。各省的段位区间在网上貌似有数据,暂时没有收集,等什么时候有时间了整理后再补上。