判斷ip是否在一個網段內

需求:給支付寶服務端異步通知加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("無門");
        }
    }   

 

馬克。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章