需求:后端数据库存储ip和ip段,服务器获取当前ip和后端库中的ip进行判断。
ip段有两种类型:如196.168.0.1~196.168.0.7和172.0.0.1/24
实现代码:
@ComponentpublicclassNetWorkUtils{/*
* 三种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
*/publicbooleanIPObj1(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{//只有一个ipString[] 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
*/publicbooleanIPObj2(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);}publicstaticvoidmain(String[] args){NetWorkUtils netWorkUtils=newNetWorkUtils();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));}}