需求:后端数据库存储ip和ip段,服务器获取当前ip和后端库中的ip进行判断。
ip段有两种类型:如196.168.0.1~196.168.0.7和172.0.0.1/24
实现代码:
@Component
public class NetWorkUtils {
/*
* 三种ip方式进行处理。传入判断的ip,和要比较的ip或ip段,返回boolean
* 1、127.0.0.1
* 2、10.8.110.0/24段
* 3、196.168.0.1~196.168.0.25段
* */
/*
* 1和2可以放在一起接受
* 接受参数两个(String,String[])返回boolean*/
/**
*
* @param[ip, strip]
* @return boolean
* @description 判断1和2 ip类型
* @author lizh
* @date 2022/1/18 10:06
* @version
*/
public boolean IPObj1(String ip,String strip[]){
/**
* ip地址转成long型数字
* 将IP地址转化成整数的方法如下:
* 1、通过String的split方法按.分隔得到4个长度的数组
* 2、通过左移位操作(<<)给每一段的数字加权,第一段的权为2的24次方,第二段的权为2的16次方,第三段的权为2的8次方,最后一段的权为1
*/
String[] ipp = ip.split("\\.");
Long lIp = (Long.parseLong(ipp[0]) << 24) + (Long.parseLong(ipp[1]) << 16) + (Long.parseLong(ipp[2]) << 8) + Long.parseLong(ipp[3]);
if (strip.length > 1) {
//是类似196.168.0.1~196.168.0.25的段
String[] ip1 = strip[0].split("\\.");
String[] ip2 = strip[1].split("\\.");
Long lIp1 = (Long.parseLong(ip1[0]) << 24) + (Long.parseLong(ip1[1]) << 16) + (Long.parseLong(ip1[2]) << 8) + Long.parseLong(ip1[3]);
Long lIp2 = (Long.parseLong(ip2[0]) << 24) + (Long.parseLong(ip2[1]) << 16) + (Long.parseLong(ip2[2]) << 8) + Long.parseLong(ip2[3]);
return (lIp <= lIp2 && lIp >= lIp1) ? true : false;
} else {
//只有一个ip
String[] ip1 = strip[0].split("\\.");
Long lIp1 = (Long.parseLong(ip1[0]) << 24) + (Long.parseLong(ip1[1]) << 16) + (Long.parseLong(ip1[2]) << 8) + Long.parseLong(ip1[3]);
return lIp.equals(lIp1) ?true:false;
}
}
/**
*
* @param[ip, strip]
* @return boolean
* @description 判断3 ip类型
* @author lizh
* @date 2022/1/18 10:09
* @version
*/
public boolean IPObj2(String ip, String strip) {
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(strip.replaceAll(".*/", ""));
int mask = 0xFFFFFFFF << (32 - type);
String cidrIp = strip.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) {
NetWorkUtils netWorkUtils=new NetWorkUtils();
String ip ="172.0.0.1";
String []strip={"172.0.0.1"};
String strip2="192.0.1.2/23";
System.out.println(netWorkUtils.IPObj1(ip,strip));
System.out.println(netWorkUtils.IPObj2(ip,strip2));
}
}