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

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

Springboot過(guò)濾器禁止ip頻繁訪問(wèn)功能實(shí)現(xiàn)

瀏覽:169日期:2023-05-24 09:01:04

在開(kāi)發(fā) Web 項(xiàng)目的時(shí)候,經(jīng)常需要過(guò)濾器來(lái)處理一些請(qǐng)求,包括字符集轉(zhuǎn)換什么的,記錄請(qǐng)求日志什么的等等。在之前的 Web 開(kāi)發(fā)中,我們習(xí)慣把過(guò)濾器配置到 web.xml 中,但是在 SpringBoot 中,兵沒(méi)有這個(gè)配置文件,該如何操作呢?

1.編寫(xiě)一個(gè)過(guò)濾器:

import lombok.extern.slf4j.Slf4j; import javax.servlet.*;import javax.servlet.annotation.WebFilter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.util.Iterator;import java.util.Set;import java.util.concurrent.ConcurrentHashMap; @Slf4j@WebFilter(urlPatterns='/dyflight/*')public class IpFilter implements Filter{ /** * 默認(rèn)限制時(shí)間(單位:ms)3600000,3600(s), */ private static final long LIMITED_TIME_MILLIS = 10 * 1000; /** * 用戶連續(xù)訪問(wèn)最高閥值,超過(guò)該值則認(rèn)定為惡意操作的IP,進(jìn)行限制 */ private static final int LIMIT_NUMBER = 5; /** * 用戶訪問(wèn)最小安全時(shí)間,在該時(shí)間內(nèi)如果訪問(wèn)次數(shù)大于閥值,則記錄為惡意IP,否則視為正常訪問(wèn) */ private static final int MIN_SAFE_TIME = 5000; private FilterConfig config; @Override public void init(FilterConfig filterConfig) throws ServletException { this.config = filterConfig; //設(shè)置屬性filterConfig } /* (non-Javadoc) * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) */ @SuppressWarnings('unchecked') @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; ServletContext context = config.getServletContext(); // 獲取限制IP存儲(chǔ)器:存儲(chǔ)被限制的IP信息 //Map<String, Long> limitedIpMap = (Map<String, Long>) context.getAttribute('limitedIpMap'); ConcurrentHashMap<String ,Long> limitedIpMap = (ConcurrentHashMap<String, Long>) context.getAttribute('limitedIpMap'); // 過(guò)濾受限的IP filterLimitedIpMap(limitedIpMap); // 獲取用戶IP String ip = IPUtil.getRemoteIpAddr(request); System.err.println('ip:'+ip); // 判斷是否是被限制的IP,如果是則跳到異常頁(yè)面 if (isLimitedIP(limitedIpMap, ip)) { long limitedTime = limitedIpMap.get(ip) - System.currentTimeMillis(); // 剩余限制時(shí)間(用為從毫秒到秒轉(zhuǎn)化的一定會(huì)存在些許誤差,但基本可以忽略不計(jì)) request.setAttribute('remainingTime', ((limitedTime / 1000) + (limitedTime % 1000 > 0 ? 1 : 0))); System.err.println('ip訪問(wèn)過(guò)于頻繁:'+ip); throw new RuntimeException('ip訪問(wèn)過(guò)于頻繁'); } // 獲取IP存儲(chǔ)器 ConcurrentHashMap<String, Long[]> ipMap = (ConcurrentHashMap<String, Long[]>) context.getAttribute('ipMap'); // 判斷存儲(chǔ)器中是否存在當(dāng)前IP,如果沒(méi)有則為初次訪問(wèn),初始化該ip // 如果存在當(dāng)前ip,則驗(yàn)證當(dāng)前ip的訪問(wèn)次數(shù) // 如果大于限制閥值,判斷達(dá)到閥值的時(shí)間,如果不大于[用戶訪問(wèn)最小安全時(shí)間]則視為惡意訪問(wèn),跳轉(zhuǎn)到異常頁(yè)面 if (ipMap.containsKey(ip)) { Long[] ipInfo = ipMap.get(ip); ipInfo[0] = ipInfo[0] + 1; log.debug('當(dāng)前第[' + (ipInfo[0]) + ']次訪問(wèn)'); if (ipInfo[0] > LIMIT_NUMBER) {Long ipAccessTime = ipInfo[1];Long currentTimeMillis = System.currentTimeMillis(); log.debug('ip訪問(wèn)過(guò)于頻繁:currentTimeMillis: '+currentTimeMillis+' - ipAccessTime:'+ipAccessTime+' : ' + (currentTimeMillis - ipAccessTime) + '<='+ MIN_SAFE_TIME); if (currentTimeMillis - ipAccessTime <= MIN_SAFE_TIME) { limitedIpMap.put(ip, currentTimeMillis + LIMITED_TIME_MILLIS); request.setAttribute('remainingTime', LIMITED_TIME_MILLIS); log.debug('ip訪問(wèn)過(guò)于頻繁:LIMITED_TIME_MILLIS:'+LIMITED_TIME_MILLIS); log.debug('ip訪問(wèn)過(guò)于頻繁:'+ip); throw new RuntimeException('ip訪問(wèn)過(guò)于頻繁');} else { initIpVisitsNumber(ipMap, ip);} } } else { initIpVisitsNumber(ipMap, ip); System.out.println('您首次訪問(wèn)該網(wǎng)站'); } context.setAttribute('ipMap', ipMap); chain.doFilter(request, response); } @Override public void destroy() { // TODO Auto-generated method stub } /** * @Description 過(guò)濾受限的IP,剔除已經(jīng)到期的限制IP * @param limitedIpMap */ private void filterLimitedIpMap(ConcurrentHashMap<String, Long> limitedIpMap) { if (limitedIpMap == null) { return; } Set<String> keys = limitedIpMap.keySet(); Iterator<String> keyIt = keys.iterator(); long currentTimeMillis = System.currentTimeMillis(); while (keyIt.hasNext()) { long expireTimeMillis = limitedIpMap.get(keyIt.next()); log.debug('expireTimeMillis <= currentTimeMillis:'+ expireTimeMillis+' <='+ currentTimeMillis); if (expireTimeMillis <= currentTimeMillis) {keyIt.remove(); } } } /** * @Description 是否是被限制的IP * @param limitedIpMap * @param ip * @return true : 被限制 | false : 正常 */ private boolean isLimitedIP(ConcurrentHashMap<String, Long> limitedIpMap, String ip) { if (limitedIpMap == null || ip == null) { // 沒(méi)有被限制 return false; } Set<String> keys = limitedIpMap.keySet(); Iterator<String> keyIt = keys.iterator(); while (keyIt.hasNext()) { String key = keyIt.next(); if (key.equals(ip)) {// 被限制的IPreturn true; } } return false; } /** * 初始化用戶訪問(wèn)次數(shù)和訪問(wèn)時(shí)間 * * @param ipMap * @param ip */ private void initIpVisitsNumber(ConcurrentHashMap<String, Long[]> ipMap, String ip) { Long[] ipInfo = new Long[2]; ipInfo[0] = 0L;// 訪問(wèn)次數(shù) ipInfo[1] = System.currentTimeMillis();// 初次訪問(wèn)時(shí)間 ipMap.put(ip, ipInfo); }}

2. 創(chuàng)建一個(gè)監(jiān)聽(tīng)器:需要初始化倆個(gè)容器:

import lombok.extern.slf4j.Slf4j; import javax.servlet.ServletContext;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.annotation.WebListener;import java.util.concurrent.ConcurrentHashMap; @Slf4j@WebListenerpublic class MyApplicationListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { log.debug('liting: contextInitialized'); log.debug('MyApplicationListener初始化成功'); ServletContext context = sce.getServletContext(); // IP存儲(chǔ)器 ConcurrentHashMap<String, Long[]> ipMap = new ConcurrentHashMap<>(); context.setAttribute('ipMap', ipMap); // 限制IP存儲(chǔ)器:存儲(chǔ)被限制的IP信息 ConcurrentHashMap<String, Long> limitedIpMap = new ConcurrentHashMap<String, Long>(); context.setAttribute('limitedIpMap', limitedIpMap); log.debug('ipmap:'+ipMap.toString()+';limitedIpMap:'+limitedIpMap.toString()+'初始化成功。。。。。'); } @Override public void contextDestroyed(ServletContextEvent sce) { // TODO Auto-generated method stub }}

3.iputil

import javax.servlet.http.HttpServletRequest;import java.net.InetAddress;import java.net.UnknownHostException; public class IPUtil { public static String getRemoteIpAddr(HttpServletRequest request) { String ip = request.getHeader('x-forwarded-for'); if (ip == null || ip.length() == 0 || 'unknown'.equalsIgnoreCase(ip)) { ip = request.getHeader('Proxy-Client-IP'); } if (ip == null || ip.length() == 0 || 'unknown'.equalsIgnoreCase(ip)) { ip = request.getHeader('WL-Proxy-Client-IP'); } if (ip == null || ip.length() == 0 || 'unknown'.equalsIgnoreCase(ip)) { ip = request.getHeader('HTTP_CLIENT_IP'); } if (ip == null || ip.length() == 0 || 'unknown'.equalsIgnoreCase(ip)) { ip = request.getHeader('HTTP_X_FORWARDED_FOR'); } if (ip == null || ip.length() == 0 || 'unknown'.equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); if('127.0.0.1'.equals(ip)||'0:0:0:0:0:0:0:1'.equals(ip)){//根據(jù)網(wǎng)卡取本機(jī)配置的IPInetAddress inet=null;try { inet = InetAddress.getLocalHost();} catch (UnknownHostException e) { e.printStackTrace();}ip= inet.getHostAddress(); } } return ip; } }

4配置

springboot啟動(dòng)類中添加過(guò)濾器和監(jiān)聽(tīng)器的包掃描

@ServletComponentScan(basePackages='cn.xxx.common')

spring web.xml

過(guò)濾器

<filter> <filter-name>ipFilter</filter-name> <filter-class>com.xxxx.common.filter.IpFilter</filter-class> </filter> <filter-mapping> <filter-name>ipFilter</filter-name> <url-pattern>/dyflight/**</url-pattern> </filter-mapping>

監(jiān)聽(tīng)器:

<listener> <listener-class>com.xxxx.common.Listener.MyApplicationListener</listener-class> </listener>

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美韩一区二区| 亚洲男人在线| 国产精品jk白丝蜜臀av小说| 欧美日韩一区自拍| 欧美日韩中出| 亚洲专区视频| 国产精品最新自拍| 精品一级视频| 色在线中文字幕| 欧美va亚洲va日韩∨a综合色| 91精品91| 日本亚洲欧美天堂免费| 欧美日韩亚洲三区| 免费亚洲一区| 久久精品在线| 亚洲三级精品| 免费亚洲婷婷| 午夜欧美视频| 国产欧美91| 国产成人77亚洲精品www| 三上亚洲一区二区| 免费成人网www| 91精品国产自产在线丝袜啪| 国产精品多人| 好看的亚洲午夜视频在线| 欧美永久精品| 成人免费网站www网站高清| 亚洲一卡久久| 免费视频一区二区三区在线观看| 欧美手机在线| 国产欧美在线观看免费| 亚洲午夜视频| 国产精品一区二区免费福利视频 | 99视频在线精品国自产拍免费观看| 欧美日韩国产在线一区| 欧美天堂一区二区| 欧美日韩在线二区| 青草av.久久免费一区| 一区二区三区四区日本视频| 亚洲人成在线影院| 秋霞影视一区二区三区| 欧美久久久网站| 91精品成人| 精品久久99| 亚洲精品三级| 日本精品不卡| 国产精品对白久久久久粗| 免费视频久久| 亚洲爱爱视频| 欧美一区久久| 亚洲精品黄色| jiujiure精品视频播放| 精品成人18| 91大神在线观看线路一区| 不卡中文字幕| 中文在线免费视频| 欧美日本二区| 亚洲精品极品| 欧美日韩视频| 久久久久中文| 国产激情在线播放| 国产精品探花在线观看| 亚洲3区在线| 亚洲欧美日韩精品一区二区| 国产精品成人自拍| 日韩三区四区| 在线一区二区三区视频| 欧美日韩国产免费观看 | 亚洲四虎影院| 成午夜精品一区二区三区软件| 91精品麻豆| 亚洲精品裸体| 日韩一区欧美二区| 国产精品7m凸凹视频分类| 中文在线中文资源| 成人黄色av| 久久久精品区| 国产情侣久久| 欧美日韩xxxx| 国产日韩欧美一区二区三区 | 免费看久久久| 国产精品99精品一区二区三区∴ | 亚洲影院天堂中文av色| 欧美精品一区二区久久| 欧美一区二区三区激情视频| 香蕉视频亚洲一级| 精品少妇av| 精品久久影院| 国产资源在线观看入口av| 国产一区二区三区久久| 久久久久97| 国产一区二区三区精品在线观看| 国产极品一区| 欧美精品第一区| 久久精品国产久精国产| 久久精品国产精品亚洲毛片| 欧美在线黄色| 日本aⅴ精品一区二区三区| 日日摸夜夜添夜夜添国产精品| 蜜桃av一区二区在线观看| 视频在线观看一区| 深夜福利亚洲| 国产精品一页| 岛国av在线网站| 成人久久久久| 一区在线免费观看| 亚洲涩涩av| 欧美日韩视频免费看| 免费亚洲婷婷| 欧美一级鲁丝片| 激情欧美日韩一区| 免费国产亚洲视频| 亚洲综合婷婷| 国产精品对白| 欧美三级网址| 久久国产高清| 国产午夜久久av| sm捆绑调教国产免费网站在线观看 | 日本亚洲不卡| 久久不见久久见中文字幕免费| 乱一区二区av| 欧美亚洲在线日韩| 亚州av日韩av| 国产乱码精品| 欧美精选视频一区二区| 国产日韩专区| 国产精品亚洲四区在线观看 | 欧美va天堂| 最新亚洲国产| 精品视频在线你懂得| japanese国产精品| 日韩精品欧美精品| 欧美sm一区| 亚洲免费影视| 国产精品66| 91久久黄色| 国产精品3区| 亚洲高清成人| 国产精品男女| 9色国产精品| 美女精品视频在线| 99亚洲视频| 日韩综合在线| 天堂va欧美ⅴa亚洲va一国产| 久久精品一本| 蜜桃一区二区三区在线观看| 卡一卡二国产精品| 亚洲激情黄色| 欧美1区2区3| 国产精品美女久久久| 久久精品国产久精国产| 亚洲自啪免费| 水蜜桃精品av一区二区| 亚洲麻豆一区| 九九久久婷婷| 国产一区二区三区四区五区| 天堂精品久久久久| 欧美成人久久| 国产videos久久| 日韩av不卡一区二区| 欧美影院三区| 精品欧美视频| 日韩精品视频中文字幕| 久久国产成人午夜av影院宅| 欧美久久久网站| 久久夜色精品| 亚洲福利久久| 97欧美在线视频| 国产精品亚洲四区在线观看| 国产精品日本| 999久久久免费精品国产| 国产精品资源| 日韩一区二区三区精品视频第3页| 亚洲不卡av不卡一区二区| 国产精品白丝一区二区三区| 亚洲色图国产| 中文久久精品| 美女毛片一区二区三区四区 | 国产欧美在线| 亚洲一区有码| 国产午夜精品一区二区三区欧美| 国产网站在线| 国产成人久久精品一区二区三区| 欧美中文高清| 欧美性www| 97精品久久| 天堂久久av| 亚洲三级国产| 亚洲乱码视频| 亚洲欧美久久精品| 亚洲字幕久久| 亚洲精品第一| 在线亚洲免费| 亚州av乱码久久精品蜜桃| 日韩成人亚洲| 欧美二三四区| 91精品国产调教在线观看| 成人一二三区| 夜鲁夜鲁夜鲁视频在线播放| 91麻豆国产自产在线观看亚洲|