import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class IPvalidate
{
   
    /**
     * @param args
     */
    public static void main(String[] args)
    {
        //存放ip对象的list,ip对象包含:开始段、结束段
        List<IpDo> ipList = new ArrayList<IpDo>();
       
        //第一行ip段
        IpDo ipDo = new IpDo();
        ipDo.setBeginIp("10.166.37.0");
        ipDo.setEndIp("10.166.37.180");
        ipList.add(ipDo);
        //第二行ip段
        IpDo ipDo2 = new IpDo();
        ipDo2.setBeginIp("10.166.47.100");
        ipDo2.setEndIp("10.166.47.200");
        ipList.add(ipDo2);
        //第三行ip段
        IpDo ipDo3 = new IpDo();
        ipDo3.setBeginIp("10.166.37.150");
        ipDo3.setEndIp("10.166.37.255");
        ipList.add(ipDo3);
       
        // 校验:ip格式
        if (!validatorIpFormat(ipList))
        {
            return;
        }
        // 校验:开始ip小于等于结束ip
        if (!validatorStartIpLessThanEndIp(ipList))
        {
            return;
        }
       
        // 校验:判断IP段是否存在交集或包含关系 下标0 true or false 下标1 存在IP交集的对象
        Object[] valResult = isHaveIntersection(ipList);
        boolean flag = "true".equals(valResult[0].toString());
        if (flag)
        {
            String intersectionStr = (String)valResult[1];
            System.out.println("以下ip段存在交集,行号为:\n" + intersectionStr);
            return;
        }
       
    }
   
    /**
     * 校验:ip格式
     */
    public static boolean validatorIpFormat(List<IpDo> ipList)
    {
        int size = ipList.size();
        for (int i = 0; i < size; i++)
        {
            String pattern = "([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}";
            Matcher startMat = Pattern.compile(pattern).matcher(ipList.get(i)
                    .getBeginIp());
            Matcher endMat = Pattern.compile(pattern).matcher(ipList.get(i)
                    .getEndIp());
            if (!startMat.matches() || !endMat.matches())
            {
               
                int n = i + 1;
                System.out.println("第" + n + "行 ip格式不合法");
                return false;
            }
        }
        return true;
    }
   
    /**
     * 校验:开始ip小于等于结束ip
     */
    public static boolean validatorStartIpLessThanEndIp(List<IpDo> ipList)
    {
        boolean tag = true;
        int i = 0;
        try
        {
            int size = ipList.size();
            // 校验ip,后者>=前者
            for (i = 0; i < size; i++)
            {
                if (isLarger(ipList.get(i).getEndIp(), ipList.get(i)
                        .getBeginIp()))
                {
                    int n = i + 1;
                    System.out.println("第" + n + "行 ip结束段应该大于开始段");
                    tag = false;
                    break;
                }
            }
        }
        catch (NumberFormatException e)
        {
            tag = false;
            int n = i + 1;
            System.out.println("第" + n + "行 ip转化异常");
        }
        return tag;
    }
   
    /**
     * 判断 ip2 是否大于 ip1,若大于返回true,否则返回false
     * @param ip1 ip1
     * @param ip2 ip2
     * @return boolean boolean
     */
    public static boolean isLarger(String ip1, String ip2)
        throws NumberFormatException
    {
        boolean flag = false;
        String[] startips = ip1.split("\\.");
        String[] endIps = ip2.split("\\.");
        for (int i = 0; i < startips.length; i++)
        {
            if (Integer.parseInt(endIps[i]) > Integer.parseInt(startips[i]))
            {
                flag = true;
                break;
            }
            else
            {
                if (Integer.parseInt(endIps[i]) == Integer.parseInt(startips[i]))
                {
                    continue;
                }
                else
                {
                    break;
                }
            }
        }
        return flag;
    }
   
    /**
     * 判断提交的区域配置中,是否有存在IP段有交集的区域
     * @return 下标0 true or false 下标1 存在IP交集的对象
     */
    private static Object[] isHaveIntersection(List<IpDo> ipList)
    {
        //下标0 true or false 下标1 存在IP交集的Map对象
        Object[] obj = new Object[2];
        //默认不存在交集
        obj[0] = false;
       
        //存在交集的区域名字符串,用于界面提醒
        StringBuffer buf = new StringBuffer();
        int size = ipList.size();
        for (int i = 0; i < size - 1; i++)
        {
            IpDo temp = ipList.get(i);
            for (int j = i + 1; j < size; j++)
            {
               
                IpDo tempj = ipList.get(j);
                if (isBetweenIpSeg(temp.getBeginIp(), tempj, ".")
                        || isBetweenIpSeg(tempj.getBeginIp(), temp, "."))
                {
                    obj[0] = true;
                   
                    buf.append(i + 1);
                    buf.append('-');
                    buf.append(j + 1);
                    buf.append(',');
                }
            }
        }
       
        if (buf.length() > 0)
        {
            buf = buf.deleteCharAt(buf.length() - 1);
        }
        obj[1] = buf.toString();
        return obj;
    }
   
    /**
     * 判断IP是否在IP段内
     * @param strIp 需判断的IP
     * @param regionConfigDo IP段
     * @param ipType ipv4:'.'分割  ipv6:':'分割
     * @return 在段内'true'  不在段内'false'
     */
    private static boolean isBetweenIpSeg(String strIp, IpDo ipDo, String ipType)
    {
        if (null == ipType)
        {
            return true;
        }
        long ipNumber = parseIpToNumber(strIp);
        long startIpNumber = parseIpToNumber(ipDo.getBeginIp());
        long endIpNumber = parseIpToNumber(ipDo.getEndIp());
        if (startIpNumber > ipNumber || ipNumber > endIpNumber)
        {
            //无交集
            return false;
        }
        return true;
    }
   
    /**
     * 将IPV4的IP转换成Long
     * @param ipStr Ip
     * @return IP Number
     */
    private static long parseIpToNumber(String ipStr)
    {
        /** IP进制转换值(256)*/
        final long IPHEXNUM = 256L;
        long ipNumber = 0L;
        String[] ips = ipStr.split("\\.");
       
        ipNumber = ipNumber + Integer.parseInt(ips[0]) * IPHEXNUM * IPHEXNUM
                * IPHEXNUM;
        ipNumber = ipNumber + Integer.parseInt(ips[1]) * IPHEXNUM * IPHEXNUM;
        ipNumber = ipNumber + Integer.parseInt(ips[2]) * IPHEXNUM;
        ipNumber = ipNumber + Integer.parseInt(ips[3]);
       
        return ipNumber;
    }
}

ip校验方法:判断ip是否位于指定的范围内的更多相关文章

  1. C# 判断ip地址是否正确

    最后要用一方法判断ip地址是否正确,直接用.Net现成的类,方法如下: string ipStr="192.168.222.333"; IPAddress ip; if(IPAdd ...

  2. 最全,可直接用的一些正则校验,判断邮箱,手机号码,车牌号,身份证号,网址,账号,密码,ip,去掉html格式,工商税号等。

    一些正则校验,判断邮箱,手机号码,车牌号,身份证号,网址,账号,密码,ip,去掉html格式,工商税号等. // 判断邮箱 isValid = [text isValidEmail]; // 判断手机 ...

  3. SSRF绕过IP限制方法总结

    SSRF绕过IP限制方法总结 - Summary of SSRF methods for bypassing IP restrictions -https://www.cnblogs.com/iAmS ...

  4. 为Linux服务器设置静态IP的方法

    这里以CentOS 7系列为例设置静态IP,原来RedHat系列的Linux发行版可以通过setup工具方便的设置静态IP,但是在版本7之后setup工具的功能就逐渐减弱了,所以这时候采用修改配置文件 ...

  5. js获取IP地址方法总结_转

    js代码获取IP地址的方法,如何在js中取得客户端的IP地址.原文地址:js获取IP地址的三种方法 http://www.jbxue.com/article/11338.html 1,js取得IP地址 ...

  6. (转载)php如何判断IP为有效IP地址

    (转载)http://www.kuitao8.com/20130918/1376.shtml 多数人看到这篇日志,第一印象肯定是以为是要讲如何通过正则表达式来判断. 非也,在php5.2.0之后,有专 ...

  7. PHP判断ip地址是否合法

    1.获取真正ip地址 function get_ip(){ //判断服务器是否允许$_SERVER if(isset($_SERVER)){ if(isset($_SERVER[HTTP_X_FORW ...

  8. 服务器安全策略之《通过IP安全策略阻止某个IP访问的设置方法》

    现在我们在布署好了一个网站,发布到外网后就意味着将会接受来自四面八方的黑客攻击,这个情况很常见,我们的网站基本上每天都要接受成千上万次的攻击,有SQL注入的.有代码注入的.有CC攻击等等...而我作为 ...

  9. C# 正则表达式判断IP,URL等及其解释

    C# 正则表达式判断IP,URL等及其解释 判断IP格式方法: public static bool ValidateIPAddress(string ipAddress) { Regex valid ...

随机推荐

  1. Apache安装配置步骤

    注释:这里以Linux 红帽商业版为例~~~~~~~纯手打啊 Apache安装配置步骤 准备:关闭其他虚拟设备 #/etc/init.d/libvirtd stop #/etc/init.d/xend ...

  2. submit(提交)按钮

    为form添加一个submit(提交)按钮,点击这个按钮,表单中的数据将会被发送到通过action属性指定的地址上. 下面是submit按钮的例子: <button type="sub ...

  3. 2015年9月10-11日,杨学明老师《IPD DRY RUN》专题培训在武汉某上市企业成功举办!

    2015-9-10~11日,杨学明老师为武汉著名的光通信企业某上市公司实施了为期两天的“IPD DRY RUN”,开班前,该公司三个项目团队的负责人先后发言,烽火PMO部门领导和公开研发部网管系统的领 ...

  4. RHEL5.8使用yum安装X Window System

    硬件配置:4C+16GB 操作系统:Red Hat Enterprise Linux Server release 5.8 (Tikanga) 服务器中使用的是RHEL5.8操作系统,只安装了基本的功 ...

  5. Web Api 中返回JSON的正确做法

    在使用Web Api的时候,有时候只想返回JSON:实现这一功能有多种方法,本文提供两种方式,一种传统的,一种作者认为是正确的方法. JSON in Web API – the formatter b ...

  6. 傻逼Eclipse笔记

    Eclipse 这么傻逼的工具,还有人用,真是奇了怪了. Invalid project description 我想打开SVN 的代码 ,别让我拷到别的地方,怎么破? 正确答案是: 删除 Eclip ...

  7. mysql 去除空格

    update nm_user set nickname=TRIM(Replace(Replace(Replace(nickname,'\t',''),'\n',''),'\r',''))

  8. SpringMVC关于json、xml自动转换的原理研究[附带源码分析]

    目录 前言 现象 源码分析 实例讲解 关于配置 总结 参考资料 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.c ...

  9. linux 进程监控

    linux 进程监控 supervise Supervise是daemontools的一个工具,可以用来监控管理unix下的应用程序运行情况,在应用程序出现异常时,supervise可以重新启动指定程 ...

  10. 【点滴javascript】变量与作用域

    基本类型与引用类型 ECMAScript的的变量有两种类型: 基本类型(值类型):简单数据段 引用类型:多个值构成的对象 在变量赋值结束后,解析器必须知道这个变量时基本数据类型还是引用类型,需要注意的 ...