SpringBoot中實現攔截器級別的URl訪問過快攔截,並利用JPA實現IP黑名單的功能。
今天給大家介紹一下SpringBoot中實現攔截器級別URl過快訪問攔截,並利用JPA實現IP黑名單的功能。
上一節中已經將中已經介紹了在控制器層面上面的URL攔截,這一節則側重於網站全域性式的攔截。就是不管輸入什麼URL地址都會進行過濾,判斷是否存在URL訪問過快的情況發生。因為本文會用到前面已經講過的JPA和攔截器技術,所以接下來就不對JPA和攔截器的實現過程進行認真的講解了。有需要的朋友可以看我以前寫的部落格案例。
步驟一:下面先新建一張IP黑名單表,表的結構如下所示:
步驟二:新建一個實體類,並於黑名單表相對映。例子程式碼如下:
package example.entity; import javax.persistence.*; import java.util.Date; @Entity @Table(name = "blacklist") public class Blacklist { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; @Column(name = "ip", nullable = true, length = 30) private String ip; @Temporal(TemporalType.TIMESTAMP) private Date iptime; // 日期型別,格式:yyyy-MM-dd HH:mm:ss public Blacklist() { } public Blacklist(String ip, Date iptime) { this.ip = ip; this.iptime = iptime; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public Date getIptime() { return iptime; } public void setIptime(Date iptime) { this.iptime = iptime; } }
步驟三:新建一個黑名單的資料庫操作類,也就是dao類。例子程式碼如下:
步驟四:新建一個過濾器類,並實現對URL訪問過快的攔截,並將那些攻擊者的IP加入黑名單中去。例子程式碼如下:package example.dao; import example.entity.Blacklist; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import javax.transaction.Transactional; import java.util.List; @Transactional @Repository public interface BlacklistDao extends JpaRepository<Blacklist, Integer> { public List<Blacklist> findByIp(String ip); }
步驟五:在攔截器新增類中加入bean方法,否則JPA不能自動注入成功,因為容器還未載入就已經實現攔截器的功能了。例子程式碼如下:package example.Interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import example.controller.exception.RequestLimitException; import example.controller.limit.RequestLimit; import example.controller.limit.RequestLimitContract; import example.dao.BlacklistDao; import example.entity.Blacklist; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.stereotype.Controller; import org.springframework.stereotype.Service; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import java.util.*; /** * 自定義攔截器1 * * @author 林志強(208017534) * @myblog www.wolzq.com * @create 2016年9月20日 */ public class URLInterceptor implements HandlerInterceptor { @Autowired private BlacklistDao blacklistDao; private Map<String, Integer> redisTemplate=new HashMap<String,Integer>(); private static final Logger logger = LoggerFactory.getLogger("RequestLimitLogger"); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { String ip = request.getLocalAddr(); List<Blacklist> blackList =blacklistDao.findByIp(ip); if(blackList==null || blackList.size()==0){ urlHandle(request,10000,10); }else{ modelAndView.setViewName("/errorpage/error"); } } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } public void urlHandle(HttpServletRequest request, long limitTime,int limitCount) throws RequestLimitException { try{ String ip = request.getLocalAddr(); String url = request.getRequestURL().toString(); String key = "req_limit_".concat(url).concat(ip); if(redisTemplate.get(key)==null || redisTemplate.get(key)==0){ redisTemplate.put(key,1); }else{ redisTemplate.put(key,redisTemplate.get(key)+1); } int count = redisTemplate.get(key); if (count > 0) { Timer timer= new Timer(); TimerTask task = new TimerTask(){ @Override public void run() { redisTemplate.remove(key); } }; timer.schedule(task, limitTime); } if (count > limitCount) { addHostHandle(ip); throw new RequestLimitException(); } } catch (RequestLimitException e) { throw e; } catch (Exception e) { logger.error("發生異常: ", e); } } public void addHostHandle(String ip){ Calendar calendar = Calendar.getInstance(); Date iptime=calendar.getTime(); Blacklist blacklist=new Blacklist(ip,iptime); blacklistDao.save(blacklist); } }
package example.configuration;
import example.Interceptor.ErrorInterceptor;
import example.Interceptor.URLInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class MyWebAppConfigurer
extends WebMvcConfigurerAdapter {
@Bean
public HandlerInterceptor getMyInterceptor(){
return new URLInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 多個攔截器組成一個攔截器鏈
// addPathPatterns 用於新增攔截規則
// excludePathPatterns 使用者排除攔截
registry.addInterceptor(getMyInterceptor()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
步驟六:在html資原始檔下面新建一個錯誤介面,用於黑名單使用者的跳轉操作。例子程式碼如下:
<html>
<head>
<meta charset="UTF-8"/>
<title>Title</title>
</head>
<body>
<h1>您已經被列入黑名單中,請及時和管理員聯絡,接觸黑名單限制。。。。</h1>
</body>
</html>
這樣就已經實現了攔截器級別URl訪問過快攔截,並利用JPA實現IP黑名單的功能,是不是特別簡單呀。如果大家想要原始碼或者對部落格有啥異議都可以加我QQ:208017534 歡迎打擾哦!!!
相關推薦
SpringBoot中實現攔截器級別的URl訪問過快攔截,並利用JPA實現IP黑名單的功能。
今天給大家介紹一下SpringBoot中實現攔截器級別URl過快訪問攔截,並利用JPA實現IP黑名單的功能。 上一節中已經將中已經介紹了在控制器層面上面的URL攔截,這一節則側重於網站全域性式的攔截。就是不管輸入什麼URL地址都會進行過濾,判斷是否存在URL訪問過快的情況發
Retrofit2.0新增日誌攔截器列印URL一級返回資料
//定製OkHttp OkHttpClient.Builder httpClientBuilder = new OkHttpClient .Builder(); if (BuildConfig.DEBUG) {//釋出版本不再列印 // 日誌顯示級別
在springboot中普通的執行緒類訪問service類
首先線上程類上註解@Component @Autowired private IStudentService studentService; 呼叫時候studentService = SpringUtils.getBean("studentService")
java eclipse中修改Web專案的URL訪問路徑
檢視Web專案部署本地路徑 1、找到Server檢視(參考:Eclipse找不到某個檢視) 2、雙擊Server…開啟,如圖 Server path即為Web專案部署路徑 (預設路徑:\工作空間\.metadata.plugins\org.eclipse.wst.ser
SpringBoot(六):攔截器--只允許進入登入註冊頁面,沒登入不允許檢視其它頁面
SpringBoot註冊登入(一):User表的設計點選開啟連結SpringBoot註冊登入(二):註冊---驗證碼kaptcha的實現點選開啟連結SpringBoot註冊登入(三):註冊--驗證賬號密碼是否符合格式及後臺完成註冊功能點選開啟連結SpringBoot註冊登入(
關於攔截器與過濾器使用場景、攔截器與過濾器的區別整理
body fcm 選擇符 spf java ee 彈性 javaee 定義 asp 過濾器在web.xml中配置: (1)因為一開始在過濾器中映射的url-pattern填寫路徑是*.action。所有的action要經過它的過濾。<url-pattern>*.
【springboot】spring boot修改程式碼後無需重啟設定,在開發時實現熱部署
熱部署是什麼 大家都知道在專案開發過程中,常常會改動頁面資料或者修改資料結構,為了顯示改動效果,往往需要重啟應用檢視改變效果,其實就是重新編譯生成了新的Class檔案,這個檔案裡記錄著和程式碼等對應的各種資訊,然後Class檔案將被虛擬機器的ClassLoader載入。 而熱部署正是利用了這
Springboot中使用Mybatis框架對資料庫進行聯表查詢,踩坑填坑
因為mybatis使用的基本是原生sql語句 所以首先從資料庫開始說 以mysql資料庫為例,對錶的連線查詢分為四種 內連線,外連線,交叉連線,和聯合連線 內連線使用比較運算子根據每個表共有的列的值匹配兩個表中的行 sql語句舉例:聯接查詢user,order表
SpringMVC總結之攔截器Interceptor(例:登入攔截器)
目錄 1.前言 2.HandleInterceptor介面 3.攔截器實現使用者登入攔截 1.前言 使用攔截器,主要是為了攔截使用者的請求並進行相應的處理,比如通過攔截器進行使用者登入驗證,使用者許可權驗證等;SpringMVC中的攔截器攔截請求是通過實
定義一個包含私有成員變數和函式的類,再定義一個內部類,在內部類函式中訪問外部成員變數,並呼叫外部函式。在外部類函式中建立內部類物件,呼叫內部類函式
public class Test5 { //定義包含私有成員變數和函式 private int a = 201320883; private voi
ol3中妙用Arcgis Server Rest Export介面模擬WMS,並實現屬性過濾
概述 在本文,講述如何妙用Arcgis Server的REST Export介面實現WMS服務的呼叫和圖層的屬性過濾。 參考 1、巧用Arcgis Server的REST介面實現OL2中WMS新增過濾 2、OGC——WMS詳細介紹(arcgis server舉例) 參
JAVA-通過介面讀取本地jar包,並呼叫其中實現了介面的類中的方法
URLClassLoader classLoader = new URLClassLoader(new URL[]{new URL("jar 本地路徑,例如:file:D:/project/inputsplit-1.0-SNAPSHOT.jar")}, Thread.currentThread().ge
花生殼實現SVN客戶端遠端訪問某區域網內SVN伺服器(內網ip地址對映外網地址)
最近在做一個軟體專案的管理工作,由於專案需求提供和開發分隔兩地,需要建立遠端的版本控制。學校實驗室是通過一個路由器分配下來的固定IP,建立的SVN Server B只能被本地SVN客戶端通過本地地址訪問,不能被遠端SVN客戶端直接訪問。所以需要通過一種手段將SVN伺服器端的
基於SpirngMVC登入攔截器(使用了redis快取),僅供參考
package com.avic.common.interceptor; import java.io.IOException; import java.io.PrintWriter; import java.io.UnsupportedEncodingException;
SpringBoot中連線MYSQL資料庫,並使用JPA進行資料庫的相關操作
package example.controller; import example.dao.UserDao; import example.entity.User; import org.springframework.beans.factory.annotation.Autowired; import o
關於攔截器與過濾器使用場景、攔截器與過濾器的區別以及配置整理
轉:http://blog.csdn.net/qq_36411874/article/details/53996873 攔截器與過濾器的區別總結: 過濾器在web.xml中配置: (1)因為一開始在過濾器中對映的url-pattern填寫路徑是*.actio
Struts2攔截器、攔截器棧(Interceptor Stack)、全域性攔截器與方法攔截器
Struts2攔截器原理 Struts2攔截器是在訪問某個Action或Action的方法之前或之後實施攔截。在請求Struts2的Action時,Struts2會查詢配置檔案,並根據配置檔案例項化相應的攔截器物件。 Struts2攔截器配置 stru
在ASP.NET Core MVC中子類Controller攔截器要先於父類Controller攔截器執行
ons art bsp 分享 code 執行 configure resp 攔截器 我們知道在ASP.NET Core MVC中Controller上的Filter攔截器是有執行順序的,那麽如果我們在有繼承關系的兩個Controller類上,聲明同一種類型的Filter攔截
CSS3實現五子棋Web小遊戲,Canvas畫布和DOM兩種實現,並且具有悔棋和撤銷悔棋功能。
posit oct padding 角色 sar pac osi fse ech 用Canvas實現五子棋的思路: 1、點擊棋盤,獲取坐標x,y,計算出棋子的二維數組坐標i和j, 2、棋子的實現,先arc一個圓,再填充漸變色。 3、下完一步棋後切換畫筆和角色。 4、贏法算法
求一個整數數組中和最大的連續子數組,例如:[1, 2, -4, 4, 10, -3, 4, -5, 1]的最大連續子數組是[4, 10, -3, 4](需寫明思路,並編程實現)
class col code pan IT [] 例如 exit arr $arr = [ 1 , 2 , -4 , 4 , 10 , -23 , 4 , -5 , 1]; $max_sum = 0; $sum=0; $new = []; $i =