成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

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

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

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

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

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

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

<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,支持模糊( *)、正則;多個用,隔開。注:如果是限制某一個站點(網(wǎng)站)則在Context節(jié)點中添加。第三步:重啟Tomcat。

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

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

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

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

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

第二步:新建Java類實現(xiàn)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> <!-- 結(jié)束過濾器 -->

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

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

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

//加載的代碼://將文件轉(zhuǎn)化成流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())) {//先進(jìn)行每一段的分割String[] allowIPRanges = allowIPRange.split(',|;');if(allowIPRanges.length > 0) {//對每一段進(jìn)行遍歷for(String allowRanges : allowIPRanges) {if(allowRanges != null && !''.equals(allowRanges.trim())) {//對該段的ip進(jìn)行解析String[] ips = allowRanges.split('-');if(ips.length > 0 && ips.length < 3) {String from = ips[0];//得到該段的起始ipString to = ips[1]; //得到該段的結(jié)束ip//獲取該ip段地址的前三段,因為起始和結(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('配置文件有錯,請檢查!');}}}}}//將第三種配置方法放到allowList中if(allowIPWildcard != null && !''.equals(allowIPWildcard)) {//獲取每個含通配符的ip地址String[] allowIPWildcards = allowIPWildcard.split(',|;');if(allowIPWildcards.length > 0) {for(String ip : allowIPWildcards) {if(ip.indexOf('*') != -1) {//對*進(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('配置文件有錯,請檢查!');}}}}

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

//獲取訪問的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)行逐個檢查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進(jìn)行限制訪問 * @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為空,則認(rèn)為沒做限制,不為空則檢查是否限制if(allowList.size() == 0 || allowList == null) {filterChain.doFilter(request, response);} else {Boolean flag = false; //訪問標(biāo)志,默認(rèn)為false,限制訪問//進(jìn)行逐個檢查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結(jié)束。');}/** * 對配置文件進(jìn)行初始化并校驗 * @author 歐陽 * @serialData 20180728 * @throws IOException */public void initConfig() throws IOException {//將文件轉(zhuǎn)化成流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())) {//先進(jìn)行每一段的分割String[] allowIPRanges = allowIPRange.split(',|;');if(allowIPRanges.length > 0) {//對每一段進(jìn)行遍歷for(String allowRanges : allowIPRanges) {if(allowRanges != null && !''.equals(allowRanges.trim())) {//對該段的ip進(jìn)行解析String[] ips = allowRanges.split('-');if(ips.length > 0 && ips.length < 3) {String from = ips[0];//得到該段的起始ipString to = ips[1]; //得到該段的結(jié)束ip//獲取該ip段地址的前三段,因為起始和結(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('配置文件有錯,請檢查!');}}}}}//將第三種配置方法放到allowList中if(allowIPWildcard != null && !''.equals(allowIPWildcard)) {//獲取每個含通配符的ip地址String[] allowIPWildcards = allowIPWildcard.split(',|;');if(allowIPWildcards.length > 0) {for(String ip : allowIPWildcards) {if(ip.indexOf('*') != -1) {//對*進(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('配置文件有錯,請檢查!');}}}}//打印輸出allowListfor(String str : allowList) {System.out.println(str);}}/** * 對配置文件進(jìn)行校驗 * @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;//對第一種方式進(jìn)行校驗Pattern pattern = Pattern.compile('('+ipRegx+')|('+ipRegx+'(,|;))*');if(this.isNullorMatches(allowIP, pattern)){result = true; //匹配成功} else {result = false;}//對第二種方式進(jìn)行校驗pattern = Pattern.compile('('+ipRegx+')-('+ipRegx+')|' + '(('+ipRegx+')-('+ipRegx+')(,|;))*');if(this.isNullorMatches(allowIPRange, pattern)){result = true; //匹配成功} else {result = false;}//對第三種方式進(jì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 歐陽 * @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;}}

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

標(biāo)簽: Java
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美日韩日日骚| 欧美日韩国产美女| 免费日韩av| 亚洲黄色一区二区三区| 亚洲一区激情| 1024成人网| 国产91精品在线观看| 99精品国产在热久久下载| 日本欧美久久久久免费播放网| 不卡视频一二三| 久久免费黄色| 99精品国产高清一区二区| 欧美经典一区二区三区| 成人午夜激情在线| 91精品国产综合久久精品性色| 捆绑变态av一区二区三区| 亚洲一区二区三区四区在线免费观看 | 极品少妇一区二区三区| 欧美一级二级三级蜜桃| 高清视频一区二区| 亚洲人123区| 日韩小视频在线观看专区| 日韩欧美国产综合| 国产精品丝袜一区| 亚洲一级网站| 色综合婷婷久久| 国产精品1024| 麻豆久久久久久| 亚洲欧美一区二区在线观看| 久久综合久久综合亚洲| 欧美酷刑日本凌虐凌虐| 一区二区三区成人精品| 色综合天天综合色综合av| 国产一二三精品| 久久精品国产精品亚洲精品| 日韩一区精品字幕| 亚洲激情男女视频| 国产精品美女久久久久av爽李琼| 欧美成人女星排名| 欧美人牲a欧美精品| 欧美亚洲综合一区| 91国偷自产一区二区使用方法| 在线视频日韩| 影音先锋久久久| 狠久久av成人天堂| 欧美日韩天堂| 国产一区视频观看| 欧美福利精品| 亚洲欧美影院| 欧美另类视频在线| 午夜免费电影一区在线观看| 91论坛在线播放| 99久久国产综合精品色伊| 波多野洁衣一区| 成人av在线电影| 波多野洁衣一区| 91麻豆精品在线观看| av一二三不卡影片| 91丨九色porny丨蝌蚪| 国产精品一二三四区| 韩国理伦片一区二区三区在线播放 | 中文字幕亚洲区| 亚洲天堂中文字幕| 亚洲人精品一区| 一区二区三区欧美在线观看| 天堂影院一区二区| 精品一区二区三区不卡| 国产一区二区三区四| 成人av集中营| 色综合天天天天做夜夜夜夜做| 国产精品99免费看| 激情久久中文字幕| 免费久久99精品国产自| 欧美网站一区二区| 精品国产123| 亚洲色图制服丝袜| 亚洲成av人片一区二区| 韩国在线一区二区| 91精品国产综合久久久蜜臀粉嫩 | 国产日韩欧美| 欧洲av在线精品| 日韩精品中午字幕| 亚洲免费观看高清| 国产一区欧美一区| 在线日韩av| 精品视频一区三区九区| 国产欧美一区二区精品久导航 | 亚洲福利国产精品| 青椒成人免费视频| 波多野结衣在线一区| 伊人精品在线| 欧美亚日韩国产aⅴ精品中极品| 久久一夜天堂av一区二区三区| 亚洲一区二区三区自拍| 国产成人免费视频一区| 亚洲一级网站| 制服丝袜亚洲网站| 亚洲精品视频免费观看| 久久99国产乱子伦精品免费| 亚洲五月婷婷| 欧美日本在线一区| 中文字幕一区二区三区四区| 麻豆精品一区二区三区| 欧美精品观看| 在线成人午夜影院| 亚洲图片欧美一区| 色综合天天天天做夜夜夜夜做| 欧美亚洲国产一卡| 亚洲黄色av一区| 色综合视频在线观看| 欧美日韩国产片| 亚洲国产精品久久久久婷婷884| 99视频在线精品| 欧美日韩国产成人在线免费| 亚洲国产日韩综合久久精品| 91麻豆国产自产在线观看| 欧美日本视频在线| 亚洲高清视频的网址| 黑人一区二区| 精品99久久久久久| 国产一区二区不卡在线| 久久久久免费| 一区二区三区免费在线观看| 欧美久久成人| 久久久久一区二区三区四区| 韩国v欧美v亚洲v日本v| 亚洲在线日韩| 日韩一区在线看| 午夜精品一区二区在线观看| 精品国产凹凸成av人网站| 国产福利91精品| 欧美日韩精品三区| 青青草国产精品97视觉盛宴| 国产麻豆日韩| 亚洲精品ww久久久久久p站| 欧美久久视频| 国产精品理论片| 91在线小视频| 欧美成人激情免费网| 国产成人啪免费观看软件| 日本国产一区二区| 日本在线播放一区二区三区| 亚洲综合二区| 午夜av一区二区三区| 中日韩男男gay无套| 欧美国产综合色视频| 99久久久久免费精品国产| 日韩欧美亚洲国产另类| 精品一区二区免费视频| 欧美日韩免费一区二区三区| 久久精品国产精品青草| 欧美日韩国产片| 国产高清在线精品| 日韩一级视频免费观看在线| 国产69精品久久99不卡| 精品欧美一区二区久久| 91香蕉视频mp4| 国产精品久久久久aaaa| 一区二区在线不卡| 亚洲视频精选在线| 国产精品夜夜夜| 亚洲电影一区二区| 色婷婷综合久久久久中文一区二区 | 国产精品美女久久久久久久久| 好吊视频一区二区三区四区| 亚洲毛片av在线| 亚洲一区精彩视频| 久久机这里只有精品| 久久综合视频网| 亚洲欧洲日韩综合二区| 亚洲与欧洲av电影| 一本到不卡免费一区二区| 国产另类ts人妖一区二区| 久久亚洲精品小早川怜子| 一本色道久久综合亚洲精品不卡 | 夜夜爽www精品| 久久国产夜色精品鲁鲁99| 日韩欧美精品三级| 亚洲视频在线二区| 日韩**一区毛片| 91精品国产综合久久婷婷香蕉| 91在线视频网址| 亚洲超碰精品一区二区| 91精品欧美综合在线观看最新| 你懂的网址国产 欧美| 亚洲午夜激情网站| 欧美不卡一区二区三区四区| 亚洲欧洲精品一区| 国产一区二区伦理片| 国产精品高清亚洲| 色欲综合视频天天天| 91小视频在线观看| 一区二区三区不卡视频在线观看| 91黄色免费网站| 欧美日韩喷水| 午夜精品久久久久久久久久久 | 亚洲成av人片观看| 国产丝袜欧美中文另类| 亚洲综合欧美| 成人18精品视频|