本篇文章主要介紹了spring boot攔截器實作IP黑名單實例程式碼,具有一定的參考價值,有興趣的小夥伴們可以參考一下
前言
最近一直在搞Hexo+GithubPage 來建立個人博客,所以沒怎麼進行SpringBoot 的學習。所以今天就將上次的”?秒防刷新”進行了一番修改。上次是採用註解加攔截器(@Aspect)來實現功能的。但是,如果需求是一個全局的攔截器對於大部分URL都進行攔截的話,自己一個個加顯然是不可能的。而且上次的攔截器對於Controller的參數有所要求,在實際他人引用總是顯得不方便。所以,這次使用了繼承HandlerInterceptor來實作攔截器。
功能需求
對於項目中某類URL進行攔截,若用戶在短時間內大量訪問該鏈接,則將用戶IP列入黑名單,禁止使用者造訪網頁。 (同時,可以使用@Async來建立定時任務幫使用者解禁。)
知識記錄
spring 的攔截器HandlerInterceptor 的功能跟隨過濾器類似,但提供更精細的控制能力:在request被回應之前、request被回應之後、視圖渲染之前以及request全部結束之後。我們無法透過攔截器修改request內容,但是可以透過拋出異常(或回傳false)來暫停request的執行。
設定攔截器也很簡單,Spring 為此提供了基礎類別WebMvcConfigurerAdapter ,我們只需要重寫addInterceptors 方法新增註冊攔截器。
實作自訂攔截器只需要3步驟:
1、建立我們自己的攔截器類別並實作 HandlerInterceptor 介面。
2、建立一個 Java 類別繼承 WebMvcConfigurerAdapter,並重寫 addInterceptors 方法。
3、實例化我們自訂的攔截器,然後將物件手動新增到攔截器鏈中(在addInterceptors方法中新增)。
正式開工
IP工具類別
由於不清楚使用者代理,最好能使用一個工具類別來取得使用者真實IP。這個Google就能找到,我就不貼程式碼了。
資料庫
我使用的是MySQL資料庫,持久層框架為MyBatis。具體可參考”準備”步驟。
我在”myboot”資料庫中建立一張表”blaclist”,屬性如下:
欄位名稱 | 解釋 |
---|---|
id | 記錄的id |
# #ip | |
iptime |
實體類別
public class BlackList { private int id; private String ip; private Date iptime; // 日期类型,格式:yyyy-MM-dd HH:mm:ss //构造器 public BlackList() { } public BlackList(String ip, Date iptime) { this.ip = ip; this.iptime = iptime; } // get && set 方法 }XML
配置與對應實體配置(省略)。
@Mapper public interface BlackListDao { // 根据IP来查找记录 List<BlackList> findByIp(String ip); // 添加记录 int addBlackList(@Param("blackList") BlackList blackList); }
實作 HandlerInterceptor 介面
public class URLInterceptor implements HandlerInterceptor { @Autowired BlackListDao blackListDao; private Map<String, Integer> redisTemplate = new HashMap<String, Integer>(); private static final Logger logger = LoggerFactory.getLogger(URLInterceptor.class); //在请求处理之前进行调用(Controller方法调用之前) @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { return true; } //请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后) @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { String ip = IPAddressUtil.getClientIpAddress(httpServletRequest); List<BlackList> blackLists = blackListDao.findByIp(ip); if (blackLists == null || blackLists.size() == 0){ urlHandle(httpServletRequest, 5000, 10); } else { //强制控制跳转 modelAndView.setViewName("/errorpage/error.html"); } } //在整个请求结束之后被调用 @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { } public void urlHandle(HttpServletRequest request, long limitTime,int limitCount) throws RequestLimitException { /** * 省略业务逻辑部分,参考"准备"步骤 */ if (count > limitCount){ //符合锁定条件 Calendar calendar = Calendar.getInstance(); Date iptime=calendar.getTime(); BlackList blackList = new BlackList(ip, iptime); blackListDao.addBlackList(blackList); throw new RequestLimitException(); } } }
WebMvcConfigurerAdapter類別
設定 spring mvc的攔截器 WebMvcConfigurerAdapter。
@Configuration public class MyWebAppConfigurer extends WebMvcConfigurerAdapter { @Bean //把我们的拦截器注入为bean public HandlerInterceptor getMyInterceptor(){ return new URLInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { // 多个拦截器组成一个拦截器链 // addPathPatterns 用于添加拦截规则, 这里假设拦截 /url 后面的全部链接 // excludePathPatterns 用户排除拦截 registry.addInterceptor(getMyInterceptor()).addPathPatterns("/url/**"); super.addInterceptors(registry); } }
Controller類別
@RequestMapping("/url/test") @ResponseBody public String URLtest() { return "success"; }全面解析Java註解阿里巴巴Java開發手冊#######
以上是java實作IP黑名單的程式碼實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SublimeText3 Linux新版
SublimeText3 Linux最新版