判断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("无门");
        }
    }   

 

马克。

你可能感兴趣的:(杂乱)