国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁(yè) > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

幾行代碼,輕松搞定 Spring Boot 接口惡意刷新和暴力請(qǐng)求!

0
分享至

Java精選面試題(微信小程序):5000+道面試題和選擇題,包含Java基礎(chǔ)、并發(fā)、JVM、線程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架構(gòu)設(shè)計(jì)、大廠真題等,在線隨時(shí)刷題!

在實(shí)際項(xiàng)目使用中,必須要考慮服務(wù)的安全性,當(dāng)服務(wù)部署到互聯(lián)網(wǎng)以后,就要考慮服務(wù)被惡意請(qǐng)求和暴力攻擊的情況,下面的教程,通過(guò)interceptredis針對(duì)url+ip在一定時(shí)間內(nèi)訪問的次數(shù)來(lái)將ip禁用,可以根據(jù)自己的需求進(jìn)行相應(yīng)的修改,來(lái)打打自己的目的;

首先工程為springboot框架搭建,不再詳細(xì)敘述。

直接上核心代碼。

首先創(chuàng)建一個(gè)自定義的攔截器類,也是最核心的代碼:

/**  * @package: com.technicalinterest.group.interceptor  * @className: IpUrlLimitInterceptor  * @description: ip+url重復(fù)請(qǐng)求現(xiàn)在攔截器  * @author: Shuyu.Wang,公眾號(hào)Java精選,有驚喜!  * @since: 0.1  **/ @Slf4j publicclass IpUrlLimitInterceptor implements HandlerInterceptor { private RedisUtil getRedisUtil() { return  SpringContextUtil.getBean(RedisUtil.class);  } privatestaticfinal String LOCK_IP_URL_KEY="lock_ip_"; privatestaticfinal String IP_URL_REQ_TIME="ip_url_times_"; privatestaticfinallong LIMIT_TIMES=5; privatestaticfinalint IP_LOCK_TIME=60; @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {   log.info("request請(qǐng)求地址uri={},ip={}", httpServletRequest.getRequestURI(), IpAdrressUtil.getIpAdrress(httpServletRequest)); if (ipIsLock(IpAdrressUtil.getIpAdrress(httpServletRequest))){    log.info("ip訪問被禁止={}",IpAdrressUtil.getIpAdrress(httpServletRequest));    ApiResult result = new ApiResult(ResultEnum.LOCK_IP);    returnJson(httpServletResponse, JSON.toJSONString(result));    returnfalse;   } if(!addRequestTime(IpAdrressUtil.getIpAdrress(httpServletRequest),httpServletRequest.getRequestURI())){    ApiResult result = new ApiResult(ResultEnum.LOCK_IP);    returnJson(httpServletResponse, JSON.toJSONString(result));    returnfalse;   } returntrue;  } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {  } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {  } /**   * @Description: 判斷ip是否被禁用   * @author: shuyu.wang   * @date: 2019-10-12 13:08   * @param ip   * @return java.lang.Boolean   */ private Boolean ipIsLock(String ip){   RedisUtil redisUtil=getRedisUtil(); if(redisUtil.hasKey(LOCK_IP_URL_KEY+ip)){    returntrue;   } returnfalse;  } /**   * @Description: 記錄請(qǐng)求次數(shù)   * @author: shuyu.wang   * @date: 2019-10-12 17:18   * @param ip   * @param uri   * @return java.lang.Boolean   */ private Boolean addRequestTime(String ip,String uri){   String key=IP_URL_REQ_TIME+ip+uri;   RedisUtil redisUtil=getRedisUtil(); if (redisUtil.hasKey(key)){    long time=redisUtil.incr(key,(long)1);    if (time>=LIMIT_TIMES){     redisUtil.getLock(LOCK_IP_URL_KEY+ip,ip,IP_LOCK_TIME);     returnfalse;    }   }else {    redisUtil.getLock(key,(long)1,1);   } returntrue;  } private void returnJson(HttpServletResponse response, String json) throws Exception {   PrintWriter writer = null;   response.setCharacterEncoding("UTF-8");   response.setContentType("text/json; charset=utf-8"); try {    writer = response.getWriter();    writer.print(json);   } catch (IOException e) {    log.error("LoginInterceptor response error ---> {}", e.getMessage(), e);   } finally {    if (writer != null) {     writer.close();    }   }  } }

代碼中的使用的是分布式鎖的形式,這樣可以最大程度保證線程安全和功能的實(shí)現(xiàn)效果。代碼中設(shè)置的是1S內(nèi)同一個(gè)接口通過(guò)同一個(gè)ip訪問5次,就將該ip禁用1個(gè)小時(shí),根據(jù)自己項(xiàng)目需求可以自己適當(dāng)修改,實(shí)現(xiàn)自己想要的功能;

另外,推薦下 Spring boot 的用戶權(quán)限管理系統(tǒng)開源項(xiàng)目:

https://gitee.com/yoodb/jing-xuan

redis分布式鎖的關(guān)鍵代碼:

/**  * @package: com.shuyu.blog.util  * @className: RedisUtil  * @description:  * @author: Shuyu.Wang 公眾號(hào):Java精選,有驚喜!  * @since: 0.1  **/ @Component @Slf4j publicclass RedisUtil { privatestaticfinal Long SUCCESS = 1L; @Autowired private RedisTemplate redisTemplate; // =============================common============================ /**   * 獲取鎖   * @param lockKey   * @param value   * @param expireTime:?jiǎn)挝?秒   * @return   */ public boolean getLock(String lockKey, Object value, int expireTime) { try {    log.info("添加分布式鎖key={},expireTime={}",lockKey,expireTime);    String script = "if redis.call('setNx',KEYS[1],ARGV[1]) then if redis.call('get',KEYS[1])==ARGV[1] then return redis.call('expire',KEYS[1],ARGV[2]) else return 0 end end";    RedisScript redisScript =  new DefaultRedisScript<>(script, String.class);    Object result = redisTemplate.execute(redisScript, Collections.singletonList(lockKey), value, expireTime);    if (SUCCESS.equals(result)) {     returntrue;    }   } catch (Exception e) {    e.printStackTrace();   } returnfalse;  } /**   * 釋放鎖   * @param lockKey   * @param value   * @return   */ public boolean releaseLock(String lockKey, String value) {   String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";   RedisScript redisScript =  new DefaultRedisScript<>(script, String.class);   Object result = redisTemplate.execute(redisScript, Collections.singletonList(lockKey), value); if (SUCCESS.equals(result)) {    returntrue;   } returnfalse;  } }

最后將上面自定義的攔截器通過(guò)registry.addInterceptor添加一下,就生效了;

@Configuration @Slf4j publicclass MyWebAppConfig extends WebMvcConfigurerAdapter {     @Bean IpUrlLimitInterceptor getIpUrlLimitInterceptor(){      returnnew IpUrlLimitInterceptor();  } @Override     public void addInterceptors(InterceptorRegistry registry) {   registry.addInterceptor(getIpUrlLimitInterceptor()).addPathPatterns("/**");         super.addInterceptors(registry);     } }

自己可以寫一個(gè)for循環(huán)來(lái)測(cè)試方面的功能,這里就不詳細(xì)介紹了。

作者:wang_shuyu

https://blog.csdn.net/wang_shuyu/article/details/102531940

公眾號(hào)“Java精選”所發(fā)表內(nèi)容注明來(lái)源的,版權(quán)歸原出處所有(無(wú)法查證版權(quán)的或者未注明出處的均來(lái)自網(wǎng)絡(luò),系轉(zhuǎn)載,轉(zhuǎn)載的目的在于傳遞更多信息,版權(quán)屬于原作者。如有侵權(quán),請(qǐng)聯(lián)系,筆者會(huì)第一時(shí)間刪除處理!

最近有很多人問,有沒有讀者交流群!加入方式很簡(jiǎn)單,公眾號(hào)Java精選,回復(fù)“加群”,即可入群!

文章有幫助的話,點(diǎn)在看,轉(zhuǎn)發(fā)吧!

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點(diǎn)推薦
被曝生下畸形兒傳聞僅1月,闞清子官宣喜訊,連發(fā)三文表明態(tài)度

被曝生下畸形兒傳聞僅1月,闞清子官宣喜訊,連發(fā)三文表明態(tài)度

一口娛樂
2026-01-29 09:31:09
已確認(rèn),浙江有大到暴雪!今晚變天

已確認(rèn),浙江有大到暴雪!今晚變天

魯中晨報(bào)
2026-01-29 13:39:09
不敢置信!女子十二樂坊成員直播養(yǎng)不活自己,一晚上打賞不到3000

不敢置信!女子十二樂坊成員直播養(yǎng)不活自己,一晚上打賞不到3000

云中浮生
2026-01-24 21:37:46
奇葩!35歲女子4年不回家,母親來(lái)探望卻被懟,女子:就當(dāng)我死了

奇葩!35歲女子4年不回家,母親來(lái)探望卻被懟,女子:就當(dāng)我死了

娛樂帝皇丸
2026-01-28 15:18:51
16歲武漢男生凌晨離家,失聯(lián)超70小時(shí), 父親:未帶手機(jī)現(xiàn)金,最后出現(xiàn)在橋上不見蹤跡

16歲武漢男生凌晨離家,失聯(lián)超70小時(shí), 父親:未帶手機(jī)現(xiàn)金,最后出現(xiàn)在橋上不見蹤跡

大風(fēng)新聞
2026-01-29 13:53:22
人民日?qǐng)?bào)怒批!炫富、偷稅749萬(wàn)、跑國(guó)外,現(xiàn)又來(lái)“割內(nèi)地韭菜”

人民日?qǐng)?bào)怒批!炫富、偷稅749萬(wàn)、跑國(guó)外,現(xiàn)又來(lái)“割內(nèi)地韭菜”

小熊侃史
2026-01-18 07:20:09
港股地產(chǎn)股大漲,融創(chuàng)中國(guó)漲超30%

港股地產(chǎn)股大漲,融創(chuàng)中國(guó)漲超30%

每日經(jīng)濟(jì)新聞
2026-01-29 11:39:06
外交部:繼續(xù)深化國(guó)際執(zhí)法合作 加大力度打擊網(wǎng)賭電詐

外交部:繼續(xù)深化國(guó)際執(zhí)法合作 加大力度打擊網(wǎng)賭電詐

財(cái)聯(lián)社
2026-01-29 15:26:24
尼帕病毒來(lái)勢(shì)洶洶,建議:每家最好備6樣?xùn)|西,關(guān)鍵時(shí)刻能救命呢

尼帕病毒來(lái)勢(shì)洶洶,建議:每家最好備6樣?xùn)|西,關(guān)鍵時(shí)刻能救命呢

現(xiàn)代小青青慕慕
2026-01-28 08:59:53
阿富汗的鍋,拜登不背!

阿富汗的鍋,拜登不背!

山河路口
2026-01-28 23:12:39
心理學(xué)上有一個(gè)詞叫:梅拉賓法則(搞好人際關(guān)系最好的辦法)

心理學(xué)上有一個(gè)詞叫:梅拉賓法則(搞好人際關(guān)系最好的辦法)

經(jīng)濟(jì)觀察報(bào)
2025-09-01 10:06:25
1971年,劉思齊蒙冤入獄后向毛主席求助,毛澤東作出:娃娃們無(wú)罪

1971年,劉思齊蒙冤入獄后向毛主席求助,毛澤東作出:娃娃們無(wú)罪

史海孤雁
2026-01-27 18:02:17
瞞不住了!美媒:美軍高官已進(jìn)臺(tái)島指揮導(dǎo)彈戰(zhàn),戰(zhàn)時(shí)先炸福建沿海

瞞不住了!美媒:美軍高官已進(jìn)臺(tái)島指揮導(dǎo)彈戰(zhàn),戰(zhàn)時(shí)先炸福建沿海

史智文道
2026-01-29 16:14:14
要打就打痛!中國(guó)手段已升級(jí),日本:中方不批準(zhǔn)駐重慶總領(lǐng)事任命

要打就打痛!中國(guó)手段已升級(jí),日本:中方不批準(zhǔn)駐重慶總領(lǐng)事任命

通文知史
2026-01-28 14:30:03
太頂了!明明什么都沒露,卻性感得要命!

太頂了!明明什么都沒露,卻性感得要命!

貴圈真亂
2025-12-20 12:02:06
最新傷勢(shì)情況曝光,德約科維奇直言:對(duì)辛納絕不舉白旗

最新傷勢(shì)情況曝光,德約科維奇直言:對(duì)辛納絕不舉白旗

體育妞世界
2026-01-29 12:38:11
起風(fēng)了!加拿大已改口,禁止與中國(guó)簽協(xié)定,65萬(wàn)噸油菜籽白買了?

起風(fēng)了!加拿大已改口,禁止與中國(guó)簽協(xié)定,65萬(wàn)噸油菜籽白買了?

墨印齋
2026-01-29 11:47:54
加快男性衰老的因素:喝酒僅第5,排在第1的,很多男性還沒發(fā)現(xiàn)!

加快男性衰老的因素:喝酒僅第5,排在第1的,很多男性還沒發(fā)現(xiàn)!

醫(yī)學(xué)科普匯
2026-01-27 10:41:31
中國(guó)人一年少買了10萬(wàn)輛進(jìn)口寶馬

中國(guó)人一年少買了10萬(wàn)輛進(jìn)口寶馬

第一財(cái)經(jīng)資訊
2026-01-29 10:34:13
1973年,毛主席問楊振寧:萬(wàn)壽無(wú)疆科學(xué)嗎?楊振寧的回答,讓主席笑了

1973年,毛主席問楊振寧:萬(wàn)壽無(wú)疆科學(xué)嗎?楊振寧的回答,讓主席笑了

寄史言志
2026-01-24 17:53:13
2026-01-29 17:15:00
Java精選
Java精選
一場(chǎng)永遠(yuǎn)也演不完的戲
1768文章數(shù) 3859關(guān)注度
往期回顧 全部

科技要聞

周亞輝的AI新賭局:國(guó)內(nèi)太卷 出海另起爐灶

頭條要聞

女大學(xué)生到東北游玩暈倒雪地凍傷 三根手指或面臨截肢

頭條要聞

女大學(xué)生到東北游玩暈倒雪地凍傷 三根手指或面臨截肢

體育要聞

詹姆斯哭了!騎士視頻致敬41歲超巨

娛樂要聞

張譯不再隱瞞!公開回應(yīng)退圈息影真相

財(cái)經(jīng)要聞

崔東樹:中國(guó)汽車未來(lái)年銷或達(dá)5000萬(wàn)輛

汽車要聞

車長(zhǎng)超5米還帶后輪轉(zhuǎn)向 比亞迪海豹08/海獅08將亮相

態(tài)度原創(chuàng)

手機(jī)
教育
本地
數(shù)碼
旅游

手機(jī)要聞

游戲直播神器!iQOO 15 Ultra支持一鍵投屏 開播0門檻

教育要聞

“國(guó)家課程落地吳江行動(dòng)叢書”發(fā)布!聚焦課改前沿,共探育人新路!

本地新聞

云游中國(guó)|撥開云霧,巫山每幀都是航拍大片

數(shù)碼要聞

這種電熱水袋國(guó)家早已禁售:別再用了

旅游要聞

投資30億,一年收入500萬(wàn),玉龍雪山觀光火車關(guān)停的蛛絲馬跡

無(wú)障礙瀏覽 進(jìn)入關(guān)懷版