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

SpringBoot實現(xiàn)基于URL和IP的訪問頻率限制

 更新時間:2025年01月08日 09:02:37   作者:孤蓬&聽雨  
在現(xiàn)代?Web?應(yīng)用中,接口被惡意刷新或暴力請求是一種常見的攻擊手段,為了保護系統(tǒng)資源,需要對接口的訪問頻率進行限制,下面我們就來看看如何使用?Spring?Boot?實現(xiàn)基于?URL?和?IP?的訪問頻率限制吧

1. 引言

在現(xiàn)代 Web 應(yīng)用中,接口被惡意刷新或暴力請求是一種常見的攻擊手段。為了保護系統(tǒng)資源,防止服務(wù)器過載或服務(wù)不可用,需要對接口的訪問頻率進行限制。本文將介紹如何使用 Spring Boot 實現(xiàn)基于 URL 和 IP 的訪問頻率限制,具體步驟包括:

使用攔截器攔截請求:在每個請求到達控制器之前進行攔截。

使用 Redis 存儲訪問記錄:利用 Redis 的高性能特性來存儲每個 IP 對每個 URL 的訪問次數(shù)。

檢測訪問頻率:判斷 IP 在一定時間內(nèi)對特定 URL 的訪問次數(shù)是否超過限制。

禁用惡意 IP:如果超過限制,則將 IP 列入黑名單,禁止其后續(xù)訪問。

2. 項目依賴

首先,在 pom.xml 中添加必要的依賴,包括 Spring Boot Web、Spring Boot Starter Data Redis 和 Lombok(用于簡化代碼)。

<!-- Spring Boot Starter Data Redis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>3.4.1</version>
</dependency>

<!-- Lombok (可選,用于簡化代碼) -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

3. 配置 Redis

在 application.properties 中配置 Redis 連接信息:

server.port=8080
# Redis 配置
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.database=0
# 可選:設(shè)置密碼
# spring.redis.password=yourpassword

或在 application.yml 中配置Redis連接信息:

server:
  port: 8080

spring:
  application:
    name: urlInterceptorDemo

  data:
    # redis 配置
    redis:
      # 地址
      host: 127.0.0.1
      # 端口,默認為6379
      port: 6379
      # 數(shù)據(jù)庫索引
      database: 0
      # 密碼
      password: "123456"
      # 連接超時時間
      timeout: 10s

4. 創(chuàng)建攔截器

創(chuàng)建一個攔截器 RateLimitInterceptor,用于攔截每個請求并執(zhí)行訪問頻率限制邏輯。

package com.yyqq.urlinterceptordemo.Interceptor;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import java.util.concurrent.TimeUnit;

@Component
public class RateLimitInterceptor implements HandlerInterceptor {

    @Autowired
    public RedisTemplate redisTemplate;

    // 訪問頻率限制:每個 IP 每個 URL 最多訪問 100 次 / 分鐘
    private static final int MAX_REQUESTS = 10;
    private static final int TIME_WINDOW = 60; // 秒

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String ip = getClientIP(request);
        String url = request.getRequestURI();

        String key = "rate_limit:" + url + ":" + ip;
        long count = redisTemplate.opsForValue().increment(key, 1);
        if (count == 1) {
            // 設(shè)置鍵的過期時間為 TIME_WINDOW 秒
            redisTemplate.expire(key, TIME_WINDOW, TimeUnit.SECONDS);
        }

        if (count > MAX_REQUESTS) {
            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
            response.setContentType("text/html;charset=UTF-8");
            response.getWriter().write("請求過于頻繁,請稍后再試。");
            return false;
        }

        return true;
    }

    private String getClientIP(HttpServletRequest request) {
        String ip = request.getHeader("X-Forwarded-For");
        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip;
    }
}

代碼說明

RedisTemplate:用于與 Redis 進行交互。

MAX_REQUESTS 和 TIME_WINDOW:定義每個 IP 在每個 URL 上的最大訪問次數(shù)和時間窗口(60 秒)。

preHandle 方法:

獲取客戶端 IP 和請求的 URL。

構(gòu)建 Redis 鍵,例如 rate_limit:/api/data:192.168.1.1。

使用 increment 方法對鍵進行遞增,并設(shè)置過期時間。

如果訪問次數(shù)超過 MAX_REQUESTS,則返回 403 狀態(tài)碼,并返回錯誤信息。

getClientIP 方法:獲取客戶端的真實 IP,處理代理和負載均衡的情況。

5. 注冊攔截器

創(chuàng)建一個配置類 WebConfig,將攔截器注冊到 Spring MVC 中。

package com.yyqq.urlinterceptordemo.config;


import com.yyqq.urlinterceptordemo.Interceptor.RateLimitInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private RateLimitInterceptor rateLimitInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(rateLimitInterceptor)
                .addPathPatterns("/**") // 攔截所有路徑
                .excludePathPatterns("/error"); // 排除錯誤路徑
    }
}

代碼說明

  • addInterceptors 方法:將自定義的攔截器添加到攔截器鏈中,并指定攔截的路徑模式。
  • addPathPatterns("/")**:攔截所有路徑。
  • excludePathPatterns(“/error”):排除錯誤路徑,避免攔截器影響錯誤處理。

6. 創(chuàng)建控制器

創(chuàng)建一個簡單的控制器 DemoController,包含一個示例接口用于測試。

package com.yyqq.urlinterceptordemo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class DemoController {

    @GetMapping("/getData")
    public String getData() {
        return "這是數(shù)據(jù)接口,現(xiàn)在訪問正常!";
    }
}

8. 測試

啟動 Spring Boot 應(yīng)用后,可以進行以下測試:

1.正常訪問:

訪問 http://localhost:8080/test/getData,應(yīng)返回 “這是數(shù)據(jù)接口,現(xiàn)在訪問正常!”。

多次快速刷新,訪問次數(shù)達到 10 次后,應(yīng)返回 “請求過于頻繁,請稍后再試。”,并返回 403 狀態(tài)碼。

2.禁用 IP:

在達到限制后,等待一段時間(60 秒),再次訪問應(yīng)恢復(fù)正常。

9. 總結(jié)

通過結(jié)合使用 Spring Boot 攔截器和 Redis,本文實現(xiàn)了一種基于 URL 和 IP 的訪問頻率限制機制。這種機制能夠有效地防止接口被惡意刷新和暴力請求,保護系統(tǒng)資源,提高應(yīng)用的安全性和穩(wěn)定性。在實際應(yīng)用中,可以根據(jù)具體需求調(diào)整訪問頻率限制的參數(shù),如最大訪問次數(shù)和時間窗口。此外,還可以結(jié)合其他安全措施,如 IP 黑名單、驗證碼等,進一步增強系統(tǒng)的防護能力。

到此這篇關(guān)于SpringBoot實現(xiàn)基于URL和IP的訪問頻率限制的文章就介紹到這了,更多相關(guān)SpringBoot訪問頻率限制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring使用xml方式整合Druid數(shù)據(jù)源連接池

    spring使用xml方式整合Druid數(shù)據(jù)源連接池

    傳統(tǒng)的JDBC數(shù)據(jù)庫連接方式,每次連接都需加載Connection到內(nèi)存并驗證,使用后再放回,從而重復(fù)利用數(shù)據(jù)庫連接資源,這不僅降低了系統(tǒng)資源消耗,還避免了頻繁連接導(dǎo)致的服務(wù)器崩潰和內(nèi)存泄漏風(fēng)險,數(shù)據(jù)庫連接池在初始化時創(chuàng)建并保持最小數(shù)量的數(shù)據(jù)庫連接
    2024-10-10
  • Java基礎(chǔ)知識精通塊作用域與條件及switch語句

    Java基礎(chǔ)知識精通塊作用域與條件及switch語句

    塊(block,即復(fù)合語句)是指由若干條 Java 語句組成的語句,并由一對大括號括起來。塊確定了變量的作用域。一個塊可以嵌套在另一個塊中;條件語句、switch語句是我們常見會用到的結(jié)構(gòu),感興趣的朋友來看看吧
    2022-04-04
  • Mybatis關(guān)聯(lián)映射舉例詳解

    Mybatis關(guān)聯(lián)映射舉例詳解

    關(guān)聯(lián)關(guān)系是面向?qū)ο蠓治?、面向?qū)ο笤O(shè)計最終的思想,Mybatis完全可以理解這種關(guān)聯(lián)關(guān)系,如果關(guān)系得當(dāng),Mybatis的關(guān)聯(lián)映射將可以大大簡化持久層數(shù)據(jù)的訪問
    2022-07-07
  • Java稀疏數(shù)組詳細圖文教程

    Java稀疏數(shù)組詳細圖文教程

    當(dāng)一個數(shù)組中的大部分元素為相同的值,可使用稀疏數(shù)組來保存該數(shù)組,可以將稀疏數(shù)組看做是普通數(shù)組的壓縮,這篇文章主要給大家介紹了關(guān)于Java稀疏數(shù)組的相關(guān)資料,需要的朋友可以參考下
    2023-09-09
  • SpringBoot+SpringSecurity實現(xiàn)基于真實數(shù)據(jù)的授權(quán)認證

    SpringBoot+SpringSecurity實現(xiàn)基于真實數(shù)據(jù)的授權(quán)認證

    Spring Security是一個功能強大且高度可定制的身份驗證和訪問控制框架,Spring Security主要做兩個事情,認證、授權(quán)。這篇文章主要介紹了SpringBoot+SpringSecurity實現(xiàn)基于真實數(shù)據(jù)的授權(quán)認證,需要的朋友可以參考下
    2021-05-05
  • JavaWeb Refresh響應(yīng)頭代碼實例詳解

    JavaWeb Refresh響應(yīng)頭代碼實例詳解

    這篇文章主要介紹了JavaWeb Refresh響應(yīng)頭代碼實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • 一文詳解如何在Java?Maven項目中使用JUnit?5進行測試

    一文詳解如何在Java?Maven項目中使用JUnit?5進行測試

    這篇文章主要介紹了如何在Java?Maven項目中使用JUnit?5進行測試的相關(guān)資料,JUnit5是一個流行的Java測試框架,它涵蓋了JUnit5的概述、環(huán)境配置、編寫測試用例、運行測試、高級特性和最佳實踐,需要的朋友可以參考下
    2025-04-04
  • Java設(shè)計模式之策略模式原理與用法實例詳解

    Java設(shè)計模式之策略模式原理與用法實例詳解

    這篇文章主要介紹了Java設(shè)計模式之策略模式原理與用法,結(jié)合實例形式較為詳細的分析了Java策略模式的概念、原理、定義及使用方法,并總結(jié)了相關(guān)的優(yōu)缺點,具有一定參考借鑒價值,需要的朋友可以參考下
    2018-04-04
  • 使用jaxws建立webservice客戶端并實現(xiàn)soap消息的handler驗證示例

    使用jaxws建立webservice客戶端并實現(xiàn)soap消息的handler驗證示例

    這篇文章主要介紹了使用jaxws建立webservice客戶端并實現(xiàn)soap消息的handler驗證示例,需要的朋友可以參考下
    2014-03-03
  • Java8(291)之后禁用了TLS1.1使JDBC無法用SSL連接SqlServer2008的解決方法

    Java8(291)之后禁用了TLS1.1使JDBC無法用SSL連接SqlServer2008的解決方法

    這篇文章主要介紹了Java8(291)之后禁用了TLS1.1使JDBC無法用SSL連接SqlServer2008的解決方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03

最新評論

怀化市| 娱乐| 鄂温| 潼关县| 呼玛县| 汝南县| 普兰县| 青神县| 余庆县| 安阳市| 建阳市| 镇巴县| 璧山县| 永安市| 扎鲁特旗| 鄂温| 岳阳县| 东宁县| 台东县| 永顺县| 禹城市| 绥阳县| 中阳县| 九江市| 米脂县| 东辽县| 含山县| 上饶县| 太仆寺旗| 剑川县| 云林县| 定南县| 贵南县| 洛阳市| 张家口市| 青龙| 古浪县| 玉溪市| 丹棱县| 永济市| 屏东市|