最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot實現(xiàn)接口防刷的兩種方法

 更新時間:2024年06月20日 10:34:17   作者:蘇生Susheng  
接口被刷指的是同一接口被頻繁調(diào)用,可能是由于以下原因?qū)е拢簮阂夤艉驼`操作或程序錯誤,本文給大家介紹了SpringBoot實現(xiàn)接口防刷的兩種方法,并有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下

什么是接口防刷

接口被刷指的是同一接口被頻繁調(diào)用,可能是由于以下原因?qū)е拢?/p>

  • 惡意攻擊: 攻擊者利用自動化腳本或工具對接口進(jìn)行大量請求,以消耗系統(tǒng)資源、拖慢系統(tǒng)響應(yīng)速度或達(dá)到其他惡意目的。
  • 誤操作或程序錯誤: 某些情況下,程序錯誤或誤操作可能導(dǎo)致接口被重復(fù)調(diào)用,例如循環(huán)調(diào)用或者定時任務(wù)配置錯誤。

常見的接口防刷策略

  1. 請求頻率限制:限制單個用戶或IP地址在一定時間內(nèi)能夠發(fā)送請求的次數(shù),防止用戶過度頻繁地發(fā)送請求。

  2. 驗證碼驗證:要求用戶在發(fā)送請求之前先進(jìn)行驗證碼驗證,從而確保該請求是來自真實用戶而不是機(jī)器人。

  3. 用戶身份認(rèn)證:要求用戶在發(fā)送請求之前先進(jìn)行身份認(rèn)證,例如使用用戶名和密碼進(jìn)行登錄或使用API密鑰進(jìn)行身份驗證,從而確保只有合法的用戶可以發(fā)送請求。

  4. 動態(tài)令牌:為每個請求生成一個動態(tài)令牌,要求客戶端在請求中附帶該令牌,服務(wù)器端根據(jù)令牌來驗證請求的合法性。

  5. 異常行為檢測:通過監(jiān)控用戶的行為和請求模式,檢測異常的請求行為,例如短時間內(nèi)發(fā)送大量請求或者發(fā)送重復(fù)請求等,從而識別和阻止惡意用戶或機(jī)器人。

Redis 實現(xiàn)接口防刷

Redis是一種高性能的鍵值存儲系統(tǒng),常用于緩存和分布式鎖等場景。利用Redis可以有效地實現(xiàn)接口防刷功能:

  • 計數(shù)器: 利用Redis的計數(shù)器功能,每次接口被調(diào)用時增加計數(shù)器的值,設(shè)定一個時間窗口內(nèi)的最大調(diào)用次數(shù),超過該次數(shù)則拒絕請求。
  • 分布式鎖: 利用Redis的分布式鎖功能,確保同一時間只有一個請求能夠增加計數(shù)器的值,防止并發(fā)問題導(dǎo)致計數(shù)器失效。

代碼示例

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.concurrent.TimeUnit;

import javax.annotation.Resource;

@Component
public class RateLimitInterceptor extends HandlerInterceptorAdapter {

    @Resource
    private RedisTemplate<String, String> redisTemplate;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String ipAddress = request.getRemoteAddr();
        String key = "rate_limit:" + ipAddress;
        long count = redisTemplate.opsForValue().increment(key, 1);
        if (count == 1) {
            redisTemplate.expire(key, 1, TimeUnit.MINUTES); // 設(shè)置過期時間,防止數(shù)據(jù)永久存儲
        }
        if (count > 100) { // 設(shè)置閾值為每分鐘最多100次請求
            response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());
            response.getWriter().write("請求過于頻繁,請稍后重試");
            return false;
        }
        return true;
    }
}

攔截器實現(xiàn)接口防刷

  • 編寫攔截器:創(chuàng)建一個實現(xiàn)HandlerInterceptor接口的攔截器類,重寫preHandle方法,在該方法中進(jìn)行接口調(diào)用次數(shù)的檢查,如果超過閾值則攔截請求。
  • 配置攔截器:在Spring Boot的配置類中通過addInterceptor方法將攔截器注冊到攔截器鏈中,配置攔截器的攔截路徑和排除路徑。

代碼示例

使用攔截器實現(xiàn)接口防刷

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class RateLimitInterceptor implements HandlerInterceptor {

    private static final int MAX_REQUESTS_PER_MINUTE = 100;
    private static final String RATE_LIMIT_KEY_PREFIX = "rate_limit:";
    private final RedisTemplate<String, String> redisTemplate;

    public RateLimitInterceptor(RedisTemplate<String, String> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String ipAddress = request.getRemoteAddr();
        String key = RATE_LIMIT_KEY_PREFIX + ipAddress;
        Long count = redisTemplate.opsForValue().increment(key, 1);
        if (count == 1) {
            redisTemplate.expire(key, 1, TimeUnit.MINUTES);
        }
        if (count > MAX_REQUESTS_PER_MINUTE) {
            response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());
            response.getWriter().write("請求過于頻繁,請稍后重試");
            return false;
        }
        return true;
    }
}

攔截器配置

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.annotation.Resource;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    private final RateLimitInterceptor rateLimitInterceptor;

    @Autowired
    public WebMvcConfig(RateLimitInterceptor rateLimitInterceptor) {
        this.rateLimitInterceptor = rateLimitInterceptor;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(rateLimitInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/exclude/**"); // 可以排除一些不需要攔截的路徑
    }
}

總結(jié)

接口防刷是保障系統(tǒng)安全和穩(wěn)定性的重要手段,利用Redis和攔截器可以很好地實現(xiàn)接口防刷功能。通過合理設(shè)置閾值和時間窗口,以及監(jiān)控系統(tǒng)日志,可以及時發(fā)現(xiàn)異常情況并采取相應(yīng)措施,確保系統(tǒng)正常運行

以上就是SpringBoot實現(xiàn)接口防刷的兩種方法的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot接口防刷的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java線程池拒絕策略場景分析

    Java線程池拒絕策略場景分析

    不同的業(yè)務(wù)場景對任務(wù)丟失的容忍度、響應(yīng)延遲的要求、系統(tǒng)保護(hù)的需求各不相同,本文就來介紹一下Java線程池拒絕策略場景分析,感興趣的可以了解一下
    2026-04-04
  • 詳解基于Mybatis-plus多租戶實現(xiàn)方案

    詳解基于Mybatis-plus多租戶實現(xiàn)方案

    這篇文章主要介紹了詳解基于Mybatis-plus多租戶實現(xiàn)方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 數(shù)組與List之間相互轉(zhuǎn)換的方法詳解

    數(shù)組與List之間相互轉(zhuǎn)換的方法詳解

    本文是對數(shù)組與List之間相互轉(zhuǎn)換的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下。希望對大家有所幫助
    2013-10-10
  • Mybatis日志配置方式(slf4j、log4j、log4j2)

    Mybatis日志配置方式(slf4j、log4j、log4j2)

    這篇文章主要介紹了Mybatis日志配置方式(slf4j、log4j、log4j2),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java生成二維碼的兩種實現(xiàn)方式(基于Spring?Boot)

    Java生成二維碼的兩種實現(xiàn)方式(基于Spring?Boot)

    這篇文章主要給大家介紹了關(guān)于Java生成二維碼的兩種實現(xiàn)方式,文中的代碼基于Spring?Boot,本文基于JAVA環(huán)境,以SpringBoot框架為基礎(chǔ)開發(fā),文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Java面試突擊為什么要用HTTPS及它的優(yōu)點

    Java面試突擊為什么要用HTTPS及它的優(yōu)點

    這篇文章主要介紹了Java面試突擊為什么要用HTTPS及它的優(yōu)點,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • Mysql字段和java實體類屬性類型匹配方式

    Mysql字段和java實體類屬性類型匹配方式

    這篇文章主要介紹了Mysql字段和java實體類屬性類型匹配方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • spring聲明式事務(wù)@Transactional開發(fā)常犯的幾個錯誤及最新解決方案

    spring聲明式事務(wù)@Transactional開發(fā)常犯的幾個錯誤及最新解決方案

    使用聲明式事務(wù)@Transactional進(jìn)行事務(wù)一致性的管理,在開發(fā)過程中,發(fā)現(xiàn)很多開發(fā)同學(xué)都用錯了spring聲明式事務(wù)@Transactional或使用不規(guī)范,導(dǎo)致出現(xiàn)各種事務(wù)問題,這篇文章主要介紹了spring聲明式事務(wù)@Transactional開發(fā)常犯的幾個錯誤及解決辦法,需要的朋友可以參考下
    2024-02-02
  • Java實現(xiàn)PDF文檔自動化比較的教程解析

    Java實現(xiàn)PDF文檔自動化比較的教程解析

    在日常工作中,我們經(jīng)常需要處理大量的 PDF 文檔,本文將深入探討如何利用 Java 技術(shù),結(jié)合強(qiáng)大的 Spire.PDF for Java 庫,實現(xiàn) PDF 文檔的自動化比較,感興趣的可以了解下
    2025-11-11
  • Spring boot實現(xiàn)熱部署的兩種方式詳解

    Spring boot實現(xiàn)熱部署的兩種方式詳解

    這篇文章主要介紹了Spring boot實現(xiàn)熱部署的兩種方式,這兩種方法分別是使用 Spring Loaded和使用spring-boot-devtools進(jìn)行熱部署,文中給出了詳細(xì)示例代碼和介紹,需要的朋友可以參考學(xué)習(xí),下面來一起看看吧。
    2017-04-04

最新評論

茌平县| 沧州市| 保靖县| 喜德县| 稻城县| 许昌市| 东乌珠穆沁旗| 徐州市| 绥化市| 桂阳县| 云安县| 秦安县| 平谷区| 平武县| 陵川县| 仪征市| 新宾| 乐山市| 江川县| 会东县| 怀集县| 新源县| 和林格尔县| 昭平县| 甘肃省| 楚雄市| 铜梁县| 比如县| 宜昌市| 彝良县| 旌德县| 同江市| 刚察县| 济源市| 岳普湖县| 聂拉木县| 遵义县| 宁陵县| 政和县| 建水县| 浑源县|