日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IP白名单校验工具

發(fā)布時間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IP白名单校验工具 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
package com.chinaentropy.screen.common.utils;import java.util.*; import java.util.regex.Pattern;/*** @author Suqi* @version 1.0* @date 2022/2/7 14:45* @desc 配置白名單工具類*/ public final class IpWhiteCheckUtil {// IP的正則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})");public static final String DEFAULT_ALLOW_ALL_FLAG = "*";// 允許所有ip標志位public static final String DEFAULT_DENY_ALL_FLAG = "0"; // 禁止所有ip標志位/**** getAvaliIpList:(根據IP白名單設置獲取可用的IP列表).* System.out.println(getAvaliIpList("1.168.1.*;" +"192.168.3.*"));* //[1.168.1.0-1.168.1.255, 192.168.3.0-192.168.3.255]* @param* @return*/private static Set<String> getAvaliIpList(String allowIp) {String[] splitRex = allowIp.split(";");// 拆分出白名單正則Set<String> ipList = new HashSet<String>(splitRex.length);for (String allow : splitRex) {if (allow.contains("*")) {// 處理通配符 *String[] ips = allow.split("\\.");String[] from = new String[] { "0", "0", "0", "0" };String[] end = new String[] { "255", "255", "255", "255" };List<String> tem = new ArrayList<String>();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];}StringBuilder fromIP = new StringBuilder();StringBuilder endIP = new StringBuilder();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 (allow.contains("/")) {// 處理 網段 xxx.xxx.xxx./24ipList.add(allow);} else {// 處理單個 ip 或者 范圍if (validate(allow)) {ipList.add(allow);}}}return ipList;}/*** 對單個IP節(jié)點進行范圍限定** @param arg* @return 返回限定后的IP范圍,格式為List[10;19, 100;199]*/private static List<String> complete(String arg) {List<String> com = new ArrayList<String>();int len = arg.length();if (len == 1) {com.add("0;255");} else if (len == 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;}/*** 在添加至白名單時進行格式校驗** @param ip* @return*/private static boolean validate(String ip) {String[] temp = ip.split("-");for (String s : temp)if (!pattern.matcher(s).matches()) {return false;}return true;}/**** isPermited:(根據IP,及可用Ip列表來判斷ip是否包含在白名單之中).** @date 2017-4-17 下午03:01:03* @param ip* @param ipList* @return*/private static boolean isPermited(String ip, Set<String> ipList) {if (ipList.isEmpty() || ipList.contains(ip))return true;for (String allow : ipList) {if (allow.indexOf("-") > -1) {// 處理 類似 192.168.0.0-192.168.2.1String[] tempAllow = allow.split("-");String[] from = tempAllow[0].split("\\.");String[] end = tempAllow[1].split("\\.");String[] tag = ip.split("\\.");boolean check = true;for (int i = 0; i < 4; i++) {// 對IP從左到右進行逐段匹配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;} else if (allow.contains("/")) {// 處理 網段 xxx.xxx.xxx.*/24String[] 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(allow.replaceAll(".*/", ""));int mask = 0xFFFFFFFF << (32 - type);String cidrIp = allow.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);}}return false;}/**** isPermited:(根據IP地址,及IP白名單設置規(guī)則判斷IP是否包含在白名單).** @date 2017-4-17 下午03:01:37* @param ip* @param ipWhiteConfig* @return*/public static boolean isPermited(String ip, String ipWhiteConfig) {if (null == ip || "".equals(ip))return false;//ip格式不對if(!pattern.matcher(ip).matches())return false;if (DEFAULT_ALLOW_ALL_FLAG.equals(ipWhiteConfig))return true;if (DEFAULT_DENY_ALL_FLAG.equals(ipWhiteConfig))return false;Set<String> ipList = getAvaliIpList(ipWhiteConfig);return isPermited(ip, ipList);}public static void main(String[] args) {// System.out.println("192.168.0".matches("192.*")); // System.out.println(IpWhiteCheckUtil.isPermited("192.168.0.1","192.*"));String ipWhilte = "1.168.1.1;" + //設置單個IP的白名單// "192.*;" //設置ip通配符,對一個ip段進行匹配"192.168.3.17-192.168.3.38;" //設置一個IP范圍+"192.168.4.0/26;"; //設置一個網段 // System.out.println(IpWhiteCheckUtil.isPermited("1.168.1.1",ipWhilte)); //true // System.out.println(IpWhiteCheckUtil.isPermited("192.168.1.2",ipWhilte)); //false // System.out.println(IpWhiteCheckUtil.isPermited("192.168.3.16",ipWhilte)); //false // System.out.println(IpWhiteCheckUtil.isPermited("192.168.3.37",ipWhilte)); //true // System.out.println(IpWhiteCheckUtil.isPermited("192.168.4.1",ipWhilte));//true// System.out.println(getAvaliIpList("1.168.1.*;" +"192.168.3.*")); //[1.168.1.0-1.168.1.255, 192.168.3.0-192.168.3.255]}}

總結

以上是生活随笔為你收集整理的IP白名单校验工具的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。