1. 程式人生 > >ip校驗方法:判斷ip是否位於指定的範圍內

ip校驗方法:判斷ip是否位於指定的範圍內

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是否位於指定範圍

import java.util.ArrayList;import java.util.List;import java.util.regex.Matcher;import java.util.regex.Pattern; public class IPvalidate{        /**     *

C#判斷給定IP地址是否在指定範圍方法

length plugins width content 例如 c# evel 工廠方法模式 模式 本文實例講述了C#判斷給定IP地址是否在指定範圍內的方法。分享給大家供大家參考。具體分析如下: 比如給定一個ip段:127.0.0.1 ~ 127.0.0.255,我們想判

PHP獲取IP地址的方法,防止偽造IP地址註入攻擊

false online ESS -a null del known sdn 信息 原文:PHP獲取IP地址的方法,防止偽造IP地址註入攻擊PHP獲取IP地址的方法 /** * 獲取客戶端IP地址 * <br />來源:ThinkPHP * &

2018年最新電話號碼正則表示式方法

正則表示式 ^1(3[0-9]|4[57]|5[^4]|6[6]|7[0-8]|8[0-9]|9[8-9])\\d{8}$ iOS使用方法 + (BOOL)checkPhoneNumber:(NSString *)phoneNumber{ /* ** 電訊號

element UI 中 el-form 表單包含多個 el-input 時的方法

這一點element-ui真是有點死板,我是這樣解決的,有兩個情況,prop可以只繫結第一個input的,第二個input寫上ref屬性,驗證的rules中寫一個方法,這個方法驗證第一個input框的同時,通過 this.$refs.xxx.value的形式獲取第二個input框值,只要這兩

《TCP/IP協議族》TCP/IP協議頭部結構體

  乙太網頭部14 bytes Destination Source Len Data unit + pad FCS (6 bytes)

《TCP/IP協議族》TCP/IP常用埠大全

常用網路埠簡介: TCP/UDP埠可分為3大類, 按埠號分:     (1)公認埠(Well Known Ports):從0到1023,它們緊密繫結(bind)於一些服務。通常這些埠的通訊明確表明了某種服務的協議。不可隨意更改. 例如:80埠實際上總是

代理ip最新識別方法及代理ip有效性檢測方法

  網路營銷時代,網路成為企業營銷的重要工具。線上有非常多的營銷渠道可以利用。當然方法也就越來越多:自媒體、抖音、電商、微商等等,尤其當走進大資料時代,爬蟲可以幫助企業在線上採集到相當精準的使用者資訊,成為企業制定營銷策略的關鍵。當然,技術流的推廣人員都知道,爬蟲執行少不了代理ip的輔助。   代理ip最新

工具方法判斷是否為空獲取手機Imei編號等

public static boolean isEmpty(String s) { if (null == s) return true; if (s.length() == 0) return tr

C#實現字串,檔案獲取Md5加密方法

http://jingyan.baidu.com/article/db55b6099758134ba30a2f1a.html Md5是一種雜湊演算法,理論上是不可解密的,而且重複的機率極小極小,因此在平常的密碼儲存上應用比較廣泛,這個值一般情況下是唯一的,所以在檔案校驗

自定義 jquery.validate.js 方法

部落格參考:http://blog.csdn.net/yangxiaovip/article/details/21550145  jquery.validate.js 是一個前端 form 表單校驗外掛,具體詳情可以百度一下。 jquery.validate.js 不僅

奇偶,海明碼,CRC

大多數情況下,使用檢錯碼,查錯後請求重發; 只有在單工通道(沒有反向反饋),才使用糾錯功能 1. 奇偶校驗 1.1 原理 有效資料:data_code msg = data_code + check

銀行卡方法

注:此方法只能針對普通的16位和19位銀行卡校驗有效,對於卡號不規則的企業商戶開戶行無法校驗。 /** * 匹配銀行卡 * @param cardNo * @return */ public static boolean matchLuhn(String cardN

常用的資料方法

1.什麼是資料校驗 通俗的說,就是為保證資料的完整性,用一種指定的演算法對原始資料計算出的一個校驗值。接收方用同樣的演算法計算一次校驗值,如果和隨資料提供的校驗值一樣,就說明資料是完整的。 2.最簡單的檢驗 實現方法:最簡單的校驗就是把原始資料和待比較資料直接進行比較,看是

(看得懂的)海明碼的編碼和方法

轉載自:http://www.cnblogs.com/scrutable/p/6052127.html 看了半天就這個看懂了。所以轉載了。 海明碼(也叫漢明碼)具有一位糾錯能力。本文以1010110這個二進位制數為例解釋海明碼的編碼和校驗方法。   編碼   確

ip正則表示式 java判斷ip地址

  符號 '\d'等價的正則表示式'[0-9]',匹配數字0-9;  {1,3}表示匹配三位以內的數字(包括三位數) /** * Ip地址判斷<br> * 符號 '\d'等價的

軟體包的方法

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

微信小程式業務域名配置:檔案驗證失敗,請下載檔案,上傳到伺服器指定的目錄

1.校驗檔案內容錯誤。校驗檔案內容一般是非HTML資料,如果下載下來的校驗檔案內容為HTML資料,一般為登入態過期。請重新登入小程式下載校驗檔案。 2.https證書過期。請確保https證書處於有效期內。 3.使用curl 測試連結,確保curl能夠正常訪問連結。

工具學習Windows系統中刪除指定目錄的空資料夾

工具學習:Windows系統中刪除指定目錄內的空資料夾 Windows系統中刪除指定目錄內的空資料夾的步驟如下: 建立記事本Clear.txt。 將下述程式碼複製到Clear.txt中,指定你想要處理的目錄地址(程式碼中的目錄為C盤根目錄)。

JS如何用Math.random()來生成指定範圍(如1-100)的隨機數?

一、包括下線數字(lower)不包括上限數字(upper)/** * 產生隨機整數,包含下限值,但不包括上限值 * @param {Number} lower 下限 * @param {Numbe