All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.soento.core.util.IpUtil Maven / Gradle / Ivy

package com.soento.core.util;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;

/**
 * IP 工具类
 *
 * @author soento
 */
public class IpUtil {
    private static Pattern pattern =
            Pattern.compile("(1\\d{1,2}|2[0-4]\\d|25[0-5]|\\d{1,2})\\."
                    + "(1\\d{1,2}|2[0-4]\\d|25[0-5]|\\d{1,2})\\."
                    + "(1\\d{1,2}|2[0-4]\\d|25[0-5]|\\d{1,2})\\."
                    + "(1\\d{1,2}|2[0-4]\\d|25[0-5]|\\d{1,2})");

    private static Set getAvaliIpList(String ipConfig) {
        Set ipList = new HashSet<>();
        if (ipConfig.indexOf("*") > -1) {
            String[] ips = ipConfig.split("\\.");
            String[] from = new String[]{"0", "0", "0", "0"};
            String[] end = new String[]{"255", "255", "255", "255"};
            List tem = new ArrayList<>();
            for (int i = 0; i < ips.length; i++)
                if (ips[i].indexOf("*") > -1) {
                    tem = complete(ips[i]);
                    from[i] = null;
                    end[i] = null;
                } else {
                    from[i] = ips[i];
                    end[i] = ips[i];
                }

            StringBuffer fromIP = new StringBuffer();
            StringBuffer endIP = new StringBuffer();
            for (int i = 0; i < 4; i++) {
                if (from[i] != null) {
                    fromIP.append(from[i]).append(".");
                    endIP.append(end[i]).append(".");
                } else {
                    fromIP.append("[*].");
                    endIP.append("[*].");
                }
            }
            fromIP.deleteCharAt(fromIP.length() - 1);
            endIP.deleteCharAt(endIP.length() - 1);

            for (String s : tem) {
                String ip = fromIP.toString().replace("[*]",
                        s.split(";")[0]) + "-" + endIP.toString().replace("[*]", s.split(";")[1]);
                if (validate(ip)) {
                    ipList.add(ip);
                }
            }
        } else {
            if (validate(ipConfig)) {
                ipList.add(ipConfig);
            }
        }
        return ipList;
    }

    private static List complete(String arg) {
        List com = new ArrayList();
        if (arg.length() == 1) {
            com.add("0;255");
        } else if (arg.length() == 2) {
            String s1 = complete(arg, 1);
            if (s1 != null)
                com.add(s1);
            String s2 = complete(arg, 2);
            if (s2 != null)
                com.add(s2);
        } else {
            String s1 = complete(arg, 1);
            if (s1 != null)
                com.add(s1);
        }
        return com;
    }

    private static String complete(String arg, int length) {
        String from = "";
        String end = "";
        if (length == 1) {
            from = arg.replace("*", "0");
            end = arg.replace("*", "9");
        } else {
            from = arg.replace("*", "00");
            end = arg.replace("*", "99");
        }
        if (Integer.valueOf(from) > 255) {
            return null;
        }
        if (Integer.valueOf(end) > 255) {
            end = "255";
        }
        return from + ";" + end;
    }

    private static boolean validate(String ip) {
        for (String s : ip.split("-")) {
            if (!pattern.matcher(s).matches()) {
                return false;
            }
        }
        return true;
    }

    private static boolean contains(String ip, Set ipList) {
        if (ipList.isEmpty() || ipList.contains(ip)) {
            return true;
        } else {
            for (String allow : ipList) {
                if (allow.indexOf("-") > -1) {
                    String[] from = allow.split("-")[0].split("\\.");
                    String[] end = allow.split("-")[1].split("\\.");
                    String[] tag = ip.split("\\.");

                    // 对IP从左到右进行逐段匹配
                    boolean check = true;
                    for (int i = 0; i < 4; i++) {
                        int s = Integer.valueOf(from[i]);
                        int t = Integer.valueOf(tag[i]);
                        int e = Integer.valueOf(end[i]);
                        if (!(s <= t && t <= e)) {
                            check = false;
                            break;
                        }
                    }
                    if (check) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    public static boolean premit(String ip, String ipConfig) {
        Set ipList = getAvaliIpList(ipConfig);
        return contains(ip, ipList);
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy