亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

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

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

瀏覽:61日期: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
相關文章:
主站蜘蛛池模板: 啪啪一级片 | 一本久久精品一区二区 | 点击进入毛片免费观看 | 国产三级做爰高清视频a | 自偷自偷自亚洲永久 | 日本熟女毛片 | 9191亚洲高清国产 | 51国产在线 | 亚洲精品欧美综合四区 | 黄页视频在线观看免费 | 亚洲国产精品一区二区三区在线观看 | 狼人 成人 综合 亚洲 | 亚洲精品视频一区 | 网红主播vip福利视频 | 1000部拍拍拍18勿入免费凤凰福利 | 麻豆精品视频 | 免费a级毛片在线播放 | 97久视频精品视频在线老司机 | 国产aaa免费视频国产 | 成人性生免费视频 | 毛片无限看 | 在线播放黄 | 高h猛烈做哭bl壮汉受欧美 | 欧美一级三级 | 欧美日本一区亚洲欧美一区 | 久久亚洲一级α片 | 亚洲国产美女在线观看 | 国产精品一区二区国产 | 国产91精品高清一区二区三区 | 国产xvideos在线观看 | 伊人狠狠丁香婷婷综合色 | 欧美色图亚洲综合 | 婷婷亚洲五月色综合 | 一级黄色斤 | 一级毛片女学护士 | 一级女性全黄久久生活片 | 小明看看在线视频 | 国产乱码精品一区二区三区四川人 | 亚洲黄色网络 | 久久精品一区二区 | 欧美黄一片 |