1. 程式人生 > >SpringBoot中實現攔截器級別的URl訪問過快攔截,並利用JPA實現IP黑名單的功能。

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類。例子程式碼如下:
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);
}
步驟四:新建一個過濾器類,並實現對URL訪問過快的攔截,並將那些攻擊者的IP加入黑名單中去。例子程式碼如下:
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);
    }
}
步驟五:在攔截器新增類中加入bean方法,否則JPA不能自動注入成功,因為容器還未載入就已經實現攔截器的功能了。例子程式碼如下:
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 =