日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解Java Web如何限制訪問的IP的兩種方法

瀏覽:224日期:2022-08-22 09:43:45

前一陣子因為在做項目時碰到了這個功能,現在好好總結一下,至于為什么要限制IP訪問,我就不多說了。然后百度了一下,現在主要有兩種方式去限制IP訪問,第一種是最簡單的方便的,第二種是通過過濾器來限制訪問。下面我簡單介紹一下第一種方式,著重介紹第二種。

第一種方式(Tomcat配置項配置允許或限制IP訪問)

這種是最簡單的快捷的,主要就涉及Tomcat的server.xml配置。

第一步:找到server.xml文件在哪,在Tomcat的目錄下的conf文件夾下。第二步:打開server.xml文件,找到Host節點,在其中加上:

<Valve className='org.apache.catalina.valves.RemoteAddrValve' allow='127.0.0.1' deny=''/>

其中:className:表示java類名,必須是org.apache.catalina.valves.RemoteHostValve或org.apache.catalina.valves.RemoteAddrValve;allow:表示允許的IP,支持模糊(* )、正則,多個用,隔開;deny:表示限制的IP,支持模糊( *)、正則;多個用,隔開。注:如果是限制某一個站點(網站)則在Context節點中添加。第三步:重啟Tomcat。

第二種方式(通過Filter過濾器來配置允許或限制IP訪問)

(1)代碼實現的思路  通過增加配置文件properties,將允許訪問的IP按一定規則配置進去;接下來再對配置文件(這里尚且叫做配置文件)進行加載;然后再對配置文件的格式要求通過正則進行校驗;其次將配置的IP通過一個集合進行收集,可收集單條IP或一個IP的正則,因為我們這里需要用到模糊;最后對訪問者的IP與集合中的進行比對,比對通過則正常訪問,否則。反之。  在配置文件中提供三種最常見的IP配置方式:

單個IP地址的配置,多個之間用逗號或分好隔開;例如:192.168.1.50;127.0.0.1;IP地址區間方式的配置,多個區間用逗號或分好隔開;例如:172.20.32.10-172.20.32.11;172.20.32.88-172.20.32.89通配符,多個用逗號或分好隔開。例如:172.20.30.*

(2)具體實現代碼第一步:編寫配置文件/Test/src/com/config/ipConfig.properties;

#單個IP地址的配置,多個之間用逗號或分好隔開allowIP=192.168.1.50;127.0.0.1;#IP地址區間方式的配置,多個區間用逗號或分好隔開allowIPRange=172.20.32.10-172.20.32.11;172.20.32.88-172.20.32.89#通配符,多個用逗號或分好隔開allowIPWildcard=172.20.30.*;

第二步:新建Java類實現Filter;第三步:在web.xml中配置過濾器;

<!-- 過濾器 --> <!-- ip過濾器,過濾所有請求地址 --> <filter> <filter-name>IPFilter</filter-name> <filter-class>com.filter.IpFilter</filter-class> </filter> <filter-mapping> <filter-name>IPFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 結束過濾器 -->

第四步:我們需要聲明一個全局變量List來存放允許訪問的IP或正則式;

//聲明的代碼://用來存放允許訪問的ipprivate List<String> allowList = new ArrayList<String>();

第五步:需要對配置文件進行加載;在方法init中

//加載的代碼://將文件轉化成流InputStream inputStream = IpFilter.class.getResourceAsStream('../config/ipConfig.properties');Properties properties = new Properties();//通過Properties對象實例加載流properties.load(inputStream);//獲取三種配置方式的值String allowIP = properties.getProperty('allowIP');String allowIPRange = properties.getProperty('allowIPRange');String allowIPWildcard = properties.getProperty('allowIPWildcard');

第六步:校驗配置文件格式;在方法init中

//校驗的部分代碼//如果為空,說明用戶沒添加該項,不做處理if(allow == null || ''.equals(allow.trim())) {return true;} else {//在最后面沒有,或;的給添上if(!allow.endsWith(';') && !allow.endsWith(',')) {allow += ';';}//如果匹配,則返回trueif(pattern.matcher(allow).matches()) {return true;}}

第七步:獲取每種配置方式的IP;在方法init中

/* * 將每一種配置方法放置到allowList中 *///將第一種配置方法放到allowList中if(null != allowIP && !''.equals(allowIP.trim())) {String[] allowIPs = allowIP.split(',|;');for(String ip : allowIPs) {allowList.add(ip);}}//將第二種配置方法放到allowList中if(null != allowIPRange && !''.equals(allowIPRange.trim())) {//先進行每一段的分割String[] allowIPRanges = allowIPRange.split(',|;');if(allowIPRanges.length > 0) {//對每一段進行遍歷for(String allowRanges : allowIPRanges) {if(allowRanges != null && !''.equals(allowRanges.trim())) {//對該段的ip進行解析String[] ips = allowRanges.split('-');if(ips.length > 0 && ips.length < 3) {String from = ips[0];//得到該段的起始ipString to = ips[1]; //得到該段的結束ip//獲取該ip段地址的前三段,因為起始和結束的ip的前三段一樣String share = from.substring(0, from.lastIndexOf('.')+1);//獲取該ip段的起始ip的最后一段int start = Integer.parseInt(from.substring(from.lastIndexOf('.')+1, from.length()));//獲取該ip段的結束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('配置文件有錯,請檢查!');}}}}}//將第三種配置方法放到allowList中if(allowIPWildcard != null && !''.equals(allowIPWildcard)) {//獲取每個含通配符的ip地址String[] allowIPWildcards = allowIPWildcard.split(',|;');if(allowIPWildcards.length > 0) {for(String ip : allowIPWildcards) {if(ip.indexOf('*') != -1) {//對*進行替換ip = ip.replaceAll('*', '(25[0-5]|2[0-4]d|[0-1]d{2}|[1-9]?d)');allowList.add(ip);} else {throw new RuntimeException('配置文件有錯,請檢查!');}}}}

第八步:IP比對,成功匹配就正常訪問,反之則跳到錯誤頁面。這個因為是在用戶訪問時才進行的步驟,需要在doFilter方法的編寫。

//獲取訪問的IP地址String remoteAddr = request.getRemoteAddr();//System.out.println('===============' + remoteAddr);//如果allowList為空,則認為沒做限制,不為空則檢查是否限制if(allowList.size() == 0 || allowList == null) {filterChain.doFilter(request, response);} else {Boolean flag = false; //訪問標志,默認為false,限制訪問//進行逐個檢查for(String regex : allowList){if(remoteAddr.matches(regex)){//ip沒被限制,正常訪問filterChain.doFilter(request, response);flag = true; //置為true,表示不限制訪問break;}}if(!flag) {//ip被限制,跳到指定頁面request.getRequestDispatcher('WEB-INF/success/error.jsp').forward(request, response);}}

附成功后截圖:

詳解Java Web如何限制訪問的IP的兩種方法

詳解Java Web如何限制訪問的IP的兩種方法

附完整代碼:

package com.filter;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import java.util.Properties;import java.util.regex.Pattern;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;/** * 過濾器 * 功能:對訪問者IP進行限制訪問 * @author ouyang * @serial 20180728 * @version 1.0 */public class IpFilter implements Filter{//用來存放允許訪問的ipprivate List<String> allowList = new ArrayList<String>();@Overridepublic void init(FilterConfig arg0) throws ServletException {try {System.out.println('過濾器IpFilter開始初始化,功能:IP訪問限制');initConfig();} catch (IOException e) {e.printStackTrace();}}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)throws IOException, ServletException {//獲取訪問的IP地址String remoteAddr = request.getRemoteAddr();//System.out.println('===============' + remoteAddr);//如果allowList為空,則認為沒做限制,不為空則檢查是否限制if(allowList.size() == 0 || allowList == null) {filterChain.doFilter(request, response);} else {Boolean flag = false; //訪問標志,默認為false,限制訪問//進行逐個檢查for(String regex : allowList){if(remoteAddr.matches(regex)){//ip沒被限制,正常訪問filterChain.doFilter(request, response);flag = true; //置為true,表示不限制訪問break;}}if(!flag) {//ip被限制,跳到指定頁面request.getRequestDispatcher('WEB-INF/success/error.jsp').forward(request, response);}}}@Overridepublic void destroy() {System.out.println('過濾器IpFilter結束。');}/** * 對配置文件進行初始化并校驗 * @author 歐陽 * @serialData 20180728 * @throws IOException */public void initConfig() throws IOException {//將文件轉化成流InputStream inputStream = IpFilter.class.getResourceAsStream('../config/ipConfig.properties');Properties properties = new Properties();//通過Properties對象實例加載流properties.load(inputStream);//獲取三種配置方式的值String allowIP = properties.getProperty('allowIP');String allowIPRange = properties.getProperty('allowIPRange');String allowIPWildcard = properties.getProperty('allowIPWildcard');//校驗,校驗失敗后拋出異常if(!validate(allowIP, allowIPRange, allowIPWildcard)) {throw new RuntimeException('配置文件有錯,請檢查!');}/* * 將每一種配置方法放置到allowList中 *///將第一種配置方法放到allowList中if(null != allowIP && !''.equals(allowIP.trim())) {String[] allowIPs = allowIP.split(',|;');for(String ip : allowIPs) {allowList.add(ip);}}//將第二種配置方法放到allowList中if(null != allowIPRange && !''.equals(allowIPRange.trim())) {//先進行每一段的分割String[] allowIPRanges = allowIPRange.split(',|;');if(allowIPRanges.length > 0) {//對每一段進行遍歷for(String allowRanges : allowIPRanges) {if(allowRanges != null && !''.equals(allowRanges.trim())) {//對該段的ip進行解析String[] ips = allowRanges.split('-');if(ips.length > 0 && ips.length < 3) {String from = ips[0];//得到該段的起始ipString to = ips[1]; //得到該段的結束ip//獲取該ip段地址的前三段,因為起始和結束的ip的前三段一樣String share = from.substring(0, from.lastIndexOf('.')+1);//獲取該ip段的起始ip的最后一段int start = Integer.parseInt(from.substring(from.lastIndexOf('.')+1, from.length()));//獲取該ip段的結束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('配置文件有錯,請檢查!');}}}}}//將第三種配置方法放到allowList中if(allowIPWildcard != null && !''.equals(allowIPWildcard)) {//獲取每個含通配符的ip地址String[] allowIPWildcards = allowIPWildcard.split(',|;');if(allowIPWildcards.length > 0) {for(String ip : allowIPWildcards) {if(ip.indexOf('*') != -1) {//對*進行替換ip = ip.replaceAll('*', '(25[0-5]|2[0-4]d|[0-1]d{2}|[1-9]?d)');allowList.add(ip);} else {throw new RuntimeException('配置文件有錯,請檢查!');}}}}//打印輸出allowListfor(String str : allowList) {System.out.println(str);}}/** * 對配置文件進行校驗 * @author ouyang * @serialData 20180728 * @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)';//整個ip的正則String ipRegx = regx + '.' + regx + '.'+ regx + '.' + regx;//對第一種方式進行校驗Pattern pattern = Pattern.compile('('+ipRegx+')|('+ipRegx+'(,|;))*');if(this.isNullorMatches(allowIP, pattern)){result = true; //匹配成功} else {result = false;}//對第二種方式進行校驗pattern = Pattern.compile('('+ipRegx+')-('+ipRegx+')|' + '(('+ipRegx+')-('+ipRegx+')(,|;))*');if(this.isNullorMatches(allowIPRange, pattern)){result = true; //匹配成功} else {result = false;}//對第三種方式進行校驗pattern = Pattern.compile('('+regx+'.'+ regx+'.'+regx+'.'+ '*)|' + '('+regx+'.'+regx+'.'+regx+'.'+ '*(,|;))*');if(this.isNullorMatches(allowIPWildcard, pattern)){result = true; //匹配成功} else {result = false;}return result;}/** * 進行正則匹配 * @author 歐陽 * @serialData 20180728 * @param allow * @return */public Boolean isNullorMatches(String allow, Pattern pattern) {//如果為空,說明用戶沒添加該項,不做處理if(allow == null || ''.equals(allow.trim())) {return true;} else {//在最后面沒有,或;的給添上if(!allow.endsWith(';') && !allow.endsWith(',')) {allow += ';';}//如果匹配,則返回trueif(pattern.matcher(allow).matches()) {return true;}}return false;}}

到此這篇關于詳解Java Web如何限制訪問的IP的兩種方法的文章就介紹到這了,更多相關Java 限制訪問的IP內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日韩精品一区二区三区视频 | 日韩av在线播放中文字幕| 日韩高清一级| 国产专区精品| 欧美伊人久久| 国产精品中文字幕制服诱惑| 亚洲欧美视频一区二区三区| 亚洲欧美久久| 日韩欧美中文在线观看| 亚洲人成高清| 国产精品久久久亚洲一区| 久久影院一区二区三区| 另类欧美日韩国产在线| 国产色播av在线| 欧美日韩在线观看视频小说| 免费日韩精品中文字幕视频在线| 国产在线观看www| 黄色亚洲精品| 日韩精品免费一区二区夜夜嗨 | 久久av导航| 三级在线看中文字幕完整版| 不卡一区2区| 日韩精品一区二区三区中文字幕| 国产精品嫩模av在线| 国产专区精品| 99国产精品| 麻豆精品久久久| 久久九九电影| 日本欧美在线| 久久久久久久久丰满| 亚洲尤物av| 麻豆mv在线观看| 日韩高清国产一区在线| 色天使综合视频| 色8久久久久| 亚洲黄色中文字幕| 日韩精品一区二区三区免费视频| av免费不卡国产观看| 亚洲日产国产精品| 999国产精品视频| 中文字幕一区二区三区四区久久| 久久男人av资源站| 日韩av一区二区三区四区| 亚洲精品国产嫩草在线观看| 91亚洲精品在看在线观看高清| 九九精品调教| 黄色欧美在线| 欧美激情91| 日韩和欧美的一区| 免费在线看一区| 欧美特黄a级高清免费大片a级| 精品国产午夜肉伦伦影院| 天海翼精品一区二区三区| 好看不卡的中文字幕| 天堂日韩电影| 精品一区视频| 国产精品欧美日韩一区| 国产日韩一区二区三区在线| 亚洲久草在线| 亚洲aa在线| 国产亚洲字幕| 国产视频一区二区在线播放| 美女日韩在线中文字幕| 欧美一区自拍| 国产精品国产三级国产在线观看| 蜜臀av一区二区在线免费观看 | 视频一区国产视频| 不卡一区综合视频| 精品一区毛片| 国产精品毛片一区二区三区| 在线精品小视频| 99riav国产精品| 亚洲色图网站| 亚洲精品麻豆| 国产欧美日韩精品一区二区免费 | 亚洲播播91| 亚洲激情精品| 日本99精品| 97视频热人人精品免费| 日本激情一区| 亚洲作爱视频| 久久精品凹凸全集| 日韩一区自拍| 蜜臀av一区二区在线免费观看 | 日本在线精品| 免费看精品久久片| 欧美激情 亚洲a∨综合| 99久精品视频在线观看视频| 三级亚洲高清视频| 欧美激情五月| 亚洲成人精选| 日韩手机在线| 神马午夜在线视频| 欧美专区在线| 国产一区三区在线播放| 亚洲欧美不卡| 91视频一区| 91福利精品在线观看| 国户精品久久久久久久久久久不卡| 亚洲理论在线| 亚洲精品.com| 欧美日韩91| 日韩精品一卡二卡三卡四卡无卡| 美女免费视频一区| 最新国产精品久久久| 久久视频一区| 国产午夜一区| 欧美日韩国产高清| sm久久捆绑调教精品一区| 日本欧美在线| 综合日韩在线| 亚洲综合不卡| 国产综合婷婷| 国产91在线播放精品| 欧美亚洲色图校园春色| 日韩在线a电影| 欧美日韩高清| 久久婷婷丁香| 国产综合色区在线观看| 精品五月天堂| 久久精品女人| 久久国产视频网| 中文字幕视频精品一区二区三区| 婷婷精品视频| 久久视频精品| 婷婷丁香综合| 欧洲毛片在线视频免费观看| 激情黄产视频在线免费观看| 国产一区国产二区国产三区| 国产精品玖玖玖在线资源| 日本在线观看不卡视频| 日韩精品一页| 免费在线观看一区| 免费视频一区二区三区在线观看| 91嫩草精品| 久草精品视频| 日本韩国欧美超级黄在线观看| 精品一区二区三区在线观看视频| 精品国内亚洲2022精品成人| 国产黄大片在线观看| 久久久久一区| 欧美在线综合| 国产精品一区三区在线观看| 国产毛片一区二区三区| 在线看片国产福利你懂的| 日韩欧美一区二区三区免费观看| 香蕉成人av| 伊人久久成人| 国产色噜噜噜91在线精品| 久久久久久自在自线| 尤物网精品视频| 国产日本精品| 精品伊人久久| 久久高清国产| 国产精品不卡| 亚洲精品极品| 日韩免费看片| 亚欧成人精品| 久久久777| 国产精品一区二区精品视频观看| 日韩综合一区| 亚洲色图国产| 91精品一区国产高清在线gif | 国产乱人伦精品一区| 久久国产欧美| 国产精品一区二区三区av麻| 婷婷中文字幕一区| 久久久久伊人| 伊人久久亚洲| 九色精品91| 国产一区二区三区亚洲综合| 亚洲在线国产日韩欧美| 麻豆精品av| 日韩精品一区二区三区中文字幕| 成人羞羞在线观看网站| 日韩高清电影一区| 伊人久久成人| 麻豆国产91在线播放| 中文字幕日韩亚洲| 日韩午夜精品| 91精品一区国产高清在线gif| 欧美aa在线视频| 国产欧美激情| 婷婷精品久久久久久久久久不卡| 日韩欧美午夜| 成人在线黄色| 国产66精品| 欧美激情另类| 亚洲伊人av| 日韩另类视频| 亚洲午夜一级| 偷拍欧美精品| 久久久一二三| 欧美/亚洲一区| 久久精品1区| 免费毛片在线不卡| 黄色在线一区| 亚洲精品乱码久久久久久蜜桃麻豆| 夜夜精品视频| 欧美日韩三区|