Java实现内外网(校园网、局域网)判断

2022-08-01 13:19:11

需求:后端数据库存储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));}}
  • 作者:泰山码
  • 原文链接:https://blog.csdn.net/weixin_43981813/article/details/122672680
    更新时间:2022-08-01 13:19:11