需求:給支付寶服務端異步通知加IP鑑權
支付寶商戶技術給的網段地址:
103.47.4.0/22
103.52.196.0/22
110.75.128.0/19
.....
具體這是啥意思呢?
IP 分爲4個大段,一個點爲一個段,每個段轉化爲二進制佔8位,4個段也就是 32位
例如:103.47.4.0/22
其中 0/22
22 表示 ip的掩碼,意思就是:ip的前22位不動,一個段8位,22位就是在第三段,2*8 =16, 22-16 =6 所以截止到 第三段的前6位不動, 所以ip地址的 103.47. 保持不動 4 的二進制爲 000001 00 前六位保持不動, 所以只有這幾種結果 : 00000101 00000110 00000111 轉化爲 十進制分別爲 5 ,6 ,7
即:103.47.4.0/22 也即 :103.47. [4-7] .0/24 (這裏0/24是什麼意思?please)
鑑權代碼如下:
public static boolean isInRange(String ip, String cidr) {
String[] ips = ip.split("\\.");
int ipAddr = (Integer.parseInt(ips[0]) << 24)
| (Integer.parseInt(ips[1]) << 16)
| (Integer.parseInt(ips[2]) << 8) | Integer.parseInt(ips[3]);
int type = Integer.parseInt(cidr.replaceAll(".*/", ""));
int mask = 0xFFFFFFFF << (32 - type);
String cidrIp = cidr.replaceAll("/.*", "");
String[] cidrIps = cidrIp.split("\\.");
int cidrIpAddr = (Integer.parseInt(cidrIps[0]) << 24)
| (Integer.parseInt(cidrIps[1]) << 16)
| (Integer.parseInt(cidrIps[2]) << 8)
| Integer.parseInt(cidrIps[3]);
return (ipAddr & mask) == (cidrIpAddr & mask);
}
public static void main(String[] args) {
String ip[] = {"103.47.4.0/22",
"103.52.196.0/22",
"110.75.128.0/19"};
for(int i = 0; i < ip.length; i++) {
boolean flag = isInRange("103.47.5.1",ip[i]);
System.out.println(flag);
if(flag){
break;
}
System.out.println("無門");
}
}
馬克。