SpringBoot3利用AOP實現(xiàn)IP黑名單功能
更新時間:2024年09月19日 11:49:26 作者:大闊
在Web應用開發(fā)中,控制對特定IP地址的訪問權限是一個常見的需求,通過實現(xiàn)IP黑白名單功能,我們可以允許某些IP地址訪問應用,同時拒絕其他IP地址的訪問,本文將詳細介紹SpringBoot3利用AOP實現(xiàn)IP黑名單功能,并附上相應的代碼片段,需要的朋友可以參考下
本文主要介紹如何使用AOP實現(xiàn)IP黑名單功能
主要涉及三個類
- 注解類
- 切面實現(xiàn)類
- Controller類
注解類
在注解中包含了幾個檢測參數(shù)
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface IPBlackList { int maxRequests() default 10; // 最大請求次數(shù) long timeWindow() default 60000L; // 計數(shù)時間窗口,單位:毫秒 long blockTime() default 60000L; // 拉黑時間,單位:毫秒 }
切面實現(xiàn)
在doBefore方法中我調了自己的工具類不過就是一個獲取請求ip的方法,還有我過濾了內網(wǎng)ip,如果不需要可以去掉。
@Aspect @Component public class IPBlackListAspect { private final Map<String, List<Long>> requestTimes = new ConcurrentHashMap<>(); private final Map<String, Long> blackList = new ConcurrentHashMap<>(); @Before(value = "@annotation(ipBlackList)") public void doBefore(IPBlackList ipBlackList) { String clientIP = ServletUtils.getClientIP(); if (StringUtils.isBlank(clientIP)) { return; } // 內網(wǎng)不查詢 clientIP = StringUtils.contains(clientIP, "0:0:0:0:0:0:0:1") ? "127.0.0.1" : HtmlUtil.cleanHtmlTag(clientIP); if (NetUtil.isInnerIP(clientIP)) { return; } int maxRequests = ipBlackList.maxRequests(); long timeWindow = ipBlackList.timeWindow(); long blockTime = ipBlackList.blockTime(); long currentTime = System.currentTimeMillis(); // 檢查 IP 是否在黑名單中 if (blackList.containsKey(clientIP)) { long blacklistedAt = blackList.get(clientIP); if (currentTime - blacklistedAt < blockTime) { throw new RuntimeException("IP 已被拉黑,請稍后再試"); } else { blackList.remove(clientIP); // 移除過期的黑名單記錄 blackList.remove(clientIP); // 重置計時 } } // 獲取該 IP 的訪問記錄并清除超過時間窗口的記錄 List<Long> times = requestTimes.getOrDefault(clientIP, new CopyOnWriteArrayList<>()); times.removeIf(time -> currentTime - time > timeWindow); times.add(currentTime); // 記錄當前訪問時間 requestTimes.put(clientIP, times); // 檢查在時間窗口內的請求次數(shù) if (times.size() > maxRequests) { blackList.put(clientIP, currentTime); // 拉黑 IP throw new RuntimeException("請求次數(shù)過多,IP 已被拉黑"); } } }
Controller
只要在Http請求方法上加上上面定義的注解就可以
@RestController() @RequestMapping("/auth/auth") public class YunfuAuthController { @Resource private IYunfuAuthService yunfuAuthService; @PostMapping @SaIgnore @IPBlackList public R<YunfuAuthVo> auth(YunfuAuthBo bo){ return R.ok(yunfuAuthService.auth(bo)); } }
后言
到此這篇關于SpringBoot3利用AOP實現(xiàn)IP黑名單功能的文章就介紹到這了,更多相關SpringBoot3 IP黑名單內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springboot2如何集成ElasticSearch6.4.3
這篇文章主要介紹了springboot2如何集成ElasticSearch6.4.3問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07SpringCloud使用Feign實現(xiàn)遠程調用流程詳細介紹
OpenFeign源于Netflix的Feign,是http通信的客戶端。屏蔽了網(wǎng)絡通信的細節(jié),直接面向接口的方式開發(fā),讓開發(fā)者感知不到網(wǎng)絡通信細節(jié)。所有遠程調用,都像調用本地方法一樣完成2023-02-02java 畫pdf用itext調整表格寬度、自定義各個列寬的方法
這篇文章主要介紹了java 畫pdf用itext調整表格寬度、自定義各個列寬的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01