第一步:先在項(xiàng)目src文件下建立一個(gè)ipConfig.properties文件,加入黑白名單的ip
公司主營(yíng)業(yè)務(wù):網(wǎng)站建設(shè)、做網(wǎng)站、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出河西免費(fèi)做網(wǎng)站回饋大家。
1)ipConfig.properties:
#單個(gè)IP地址的配置,多個(gè)之間用逗號(hào)或分好隔開
allowIP=192.168.1.15;127.0.0.1;
#IP地址區(qū)間方式的配置,多個(gè)區(qū)間用逗號(hào)或分好隔開
allowIPRange=172.20.32.10-172.20.32.11;172.20.32.88-172.20.32.89;
#通配符,多個(gè)用逗號(hào)或分好隔開
allowIPWildcard=192.168.1.*;
二,建IpFilter,過濾器文件
/**
@version 1.0 */
public class IpFilter implements Filter{
//用來存放初始化后的IP白名單列表對(duì)應(yīng)的正則表達(dá)式
private List
@Override
public void init(FilterConfig arg0) throws ServletException {
try {
System.out.println("過濾器IpFilter開始初始化,功能:IP訪問限制");
initConfig();//在過濾器初始化的時(shí)候初始化白名單列表
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
//獲取訪問的IP地址
String remoteAddr = request.getRemoteAddr();
//System.out.println("===============" + remoteAddr);
//如果allowList為空,則認(rèn)為沒做限制,不為空則檢查是否限制
if(allowList.size() == 0 || allowList == null) {
filterChain.doFilter(request, response);
} else {
Boolean flag = false;
//訪問標(biāo)志,默認(rèn)為false,限制訪問 //進(jìn)行逐個(gè)檢查
for(String regex : allowList){
if(remoteAddr.matches(regex)){
//ip沒被限制,正常訪問
filterChain.doFilter(request, response);
flag = true;
//置為true,表示不限制訪問 break;
}
} if(!flag) {
//ip被限制,跳到指定頁(yè)面
// resp.sendRedirect("../noPrivilege.jsp");
request.getRequestDispatcher("/WEB-INF/page/noPrivilege.jsp").forward(request, response);
}
}
}
@Override
public void destroy() {
System.out.println("過濾器IpFilter結(jié)束。");
}
/* 對(duì)配置文件進(jìn)行初始化并校驗(yàn) *
public void initConfig() throws IOException {
//將文件轉(zhuǎn)化成流
/InputStream inputStream = IpFilter.class.getResourceAsStream("./config/ipConfig.properties");
Properties properties = new Properties(); //通過Properties對(duì)象實(shí)例加載流
properties.load(inputStream); /
PropertiesUtil.readProperties("ipConfig.properties");
//獲取三種配置方式的值
String allowIP = PropertiesUtil.getProperty("allowIP");
String allowIPRange = PropertiesUtil.getProperty("allowIPRange");
String allowIPWildcard = PropertiesUtil.getProperty("allowIPWildcard");
//對(duì)用戶配置的三種方式的IP白名單進(jìn)行格式校驗(yàn)
if(!validate(allowIP, allowIPRange, allowIPWildcard)) {
throw new RuntimeException("配置文件有錯(cuò),請(qǐng)檢查!");
}
/* * 將每一種配置方法放置到allowList中 */
//將第一種配置方法放到allowList中 將第一種方式配置的ip地址解析出來,添加到存放IP白名單集合
if(null != allowIP && !"".equals(allowIP.trim())) {
String[] allowIPs = allowIP.split(",|;");
for(String ip : allowIPs) {
allowList.add(ip);
}
}
//將第二種配置方法放到allowList中將第二種方式配置的ip地址解析出來,添加到存放IP白名單集合
if(null != allowIPRange && !"".equals(allowIPRange.trim())) {
//先進(jìn)行每一段的分割
String[] allowIPRanges = allowIPRange.split(",|;");
if(allowIPRanges.length > 0) {
//對(duì)每一段進(jìn)行遍歷
for(String allowRanges : allowIPRanges) {
if(allowRanges != null && !"".equals(allowRanges.trim())) {
//對(duì)該段的ip進(jìn)行解析
String[] ips = allowRanges.split("-");
if(ips.length > 0 && ips.length < 3) {
String from = ips[0];//得到該段的起始ip
String to = ips[1]; //得到該段的結(jié)束ip
//獲取該ip段地址的前三段,因?yàn)槠鹗己徒Y(jié)束的ip的前三段一樣
String share = from.substring(0, from.lastIndexOf(".")+1);
//獲取該ip段的起始ip的最后一段
int start = Integer.parseInt(from.substring(from.lastIndexOf(".")+1, from.length()));
//獲取該ip段的結(jié)束ip的最后一段
int end = Integer.parseInt(to.substring(to.lastIndexOf(".")+1, to.length()));
for(int i=start; i<=end; i++) {
String ip = share + String.valueOf(i); allowList.add(ip);
}
} else {
throw new RuntimeException("配置文件有錯(cuò),請(qǐng)檢查!");
}
}
}
}
}
//將第三種配置方法放到allowList中 將第三種方式配置的ip地址解析為一條一條的正則表達(dá)式,添加到存放IP白名單集合,如對(duì)此處不明白可以先看后面的備注
if(allowIPWildcard != null && !"".equals(allowIPWildcard)) {
//獲取每個(gè)含通配符的ip地址
String[] allowIPWildcards = allowIPWildcard.split(",|;");
if(allowIPWildcards.length > 0) {
for(String ip : allowIPWildcards) {
if(ip.indexOf("") != -1) {
//對(duì)進(jìn)行替換
ip = ip.replaceAll("\*", "(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)");
allowList.add(ip);
} else {
throw new RuntimeException("配置文件有錯(cuò),請(qǐng)檢查!");
}
}
}
}
//打印輸出allowList
for(String str : allowList) {
System.out.println(str);
}
}
/** * 對(duì)配置文件進(jìn)行校驗(yàn)
* @author hht *
* @serialData 2018-09-28 *
* @param allowIP
* @param allowIPRange
* @param allowIPWildcard
* @return */
public Boolean validate(String allowIP, String allowIPRange, String allowIPWildcard) {
Boolean result = false;
//IP地址每一段的正則
String regx = "(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)";
//整個(gè)ip的正則
String ipRegx = regx + "\\." + regx + "\\."+ regx + "\\." + regx;
//對(duì)第一種方式進(jìn)行校驗(yàn)
Pattern pattern = Pattern.compile("("+ipRegx+")|("+ipRegx+"(,|;))*");
if(this.isNullorMatches(allowIP, pattern)){
result = true; //匹配成功
} else {
result = false;
}
//對(duì)第二種方式進(jìn)行校驗(yàn)
pattern = Pattern.compile("("+ipRegx+")\-("+ipRegx+")|" + "(("+ipRegx+")\-("+ipRegx+")(,|;))");
if(this.isNullorMatches(allowIPRange, pattern)){
result = true; //匹配成功
} else {
result = false;
}
//對(duì)第三種方式進(jìn)行校驗(yàn)
pattern = Pattern.compile("("+regx+"\."+ regx+"\."+regx+"\."+ "\)|" + "("+regx+"\."+regx+"\."+regx+"\."+ "\(,|;))");
if(this.isNullorMatches(allowIPWildcard, pattern)){
result = true; //匹配成功
} else {
result = false;
}
return result;
}
/** * 進(jìn)行正則匹配 *
* @author hht *
* @serialData 2018-09-28 *
* @param allow * @return */
public Boolean isNullorMatches(String allow, Pattern pattern) {
//如果為空,說明用戶沒添加該項(xiàng),不做處理
if(allow == null || "".equals(allow.trim())) { return true; } else {
//在最后面沒有,或;的給添上
if(!allow.endsWith(";") && !allow.endsWith(",")) {
allow += ";";
}
//如果匹配,則返回true
if(pattern.matcher(allow).matches()) {
return true;
}
}
return false;
}
}
三,在項(xiàng)目中web.xml配置文件中加入過濾配置