亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用Spring?Boot如何限制在一分鐘內(nèi)某個(gè)IP只能訪問10次

 更新時(shí)間:2023年10月25日 10:03:17   作者:Miaow.Y.Hu  
有些時(shí)候,為了防止我們上線的網(wǎng)站被攻擊,或者被刷取流量,我們會(huì)對(duì)某一個(gè)ip進(jìn)行限制處理,這篇文章,我們將通過Spring?Boot編寫一個(gè)小案例,來實(shí)現(xiàn)在一分鐘內(nèi)同一個(gè)IP只能訪問10次,感興趣的朋友一起看看吧

有些時(shí)候,為了防止我們上線的網(wǎng)站被攻擊,或者被刷取流量,我們會(huì)對(duì)某一個(gè)ip進(jìn)行限制處理,這篇文章,我們將通過Spring Boot編寫一個(gè)小案例,來實(shí)現(xiàn)在一分鐘內(nèi)同一個(gè)IP只能訪問10次,當(dāng)然具體數(shù)值,是您來決定,廢話不多說,上代碼。

首先,我們需要在Spring Boot的pom.xml文件中插入我們需要的依賴。具體的依賴部分我給出如下,也是Spring Boot常用的依賴,當(dāng)然我并未在pom文件中給出Spring Boot的使用版本,因?yàn)槲矣X得并不是每個(gè)人都使用同樣的版本,這是我使用的:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </dependency>

既然說到是對(duì)ip訪問的限制,那么我們可以通過攔截器來實(shí)現(xiàn)對(duì)同一個(gè)ip地址在同一段時(shí)間段內(nèi)的多次訪問進(jìn)行限制。具體代碼如下:

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
/**
 * @author Miaow.Y.Hu
 * @date 2023年10月24日 19:01
 * @description
 */
@Component
public class RateLimitInterceptor implements HandlerInterceptor {
    private static final int MAX_REQUESTS = 10; // 同一時(shí)間段內(nèi)允許的最大請求數(shù)
    private static final long TIME_PERIOD = 60 * 1000; // 時(shí)間段,單位為毫秒 在一分鐘內(nèi)限制ip訪問次數(shù)為10次
    private Map<String, Integer> requestCounts = new HashMap<>();
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String ipAddress = request.getRemoteAddr();
        System.out.println(ipAddress);
        // 檢查 IP 地址是否已經(jīng)達(dá)到最大請求數(shù)
        if (requestCounts.containsKey(ipAddress) && requestCounts.get(ipAddress) >= MAX_REQUESTS) {
            response.setStatus(429); //設(shè)置響應(yīng)狀態(tài)碼
            response.getWriter().write("Too many requests from this IP address");
            return false;
        }
        // 更新 IP 地址的請求數(shù)
        requestCounts.put(ipAddress, requestCounts.getOrDefault(ipAddress, 0) + 1);
        // 在指定時(shí)間后清除 IP 地址的請求數(shù)
        new Timer().schedule(
                new TimerTask() {
                    @Override
                    public void run() {
                        requestCounts.remove(ipAddress);
                    }
                },
                TIME_PERIOD
        );
        return true;
    }
}

在這段代碼中,我們使用了一個(gè)Map來存儲(chǔ)每個(gè)IP地址的請求數(shù),在preHandle方法中,我們首先檢查IP地址的請求數(shù)是否已經(jīng)達(dá)到最大請求數(shù),如果是,則返回一個(gè)429當(dāng)前IP地址的請求次數(shù)太多,一分鐘只能請求10次,當(dāng)然這決定權(quán)在你,然后我們更新IP地址的請求數(shù),并在指定的時(shí)間段后清除該IP地址的請求數(shù)。

接下來,我們需要在配置類中注冊攔截器,我采用的事WebMvcConfig:

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

@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);
    }
}

在本段代碼中,我們通過構(gòu)造函數(shù)注入 RateLimitInterceptor,然后在 addInterceptors 方法中將攔截器添加到攔截器注冊表中。

現(xiàn)在,當(dāng)同一 IP 地址在同一時(shí)間段內(nèi)的請求數(shù)達(dá)到最大限制時(shí),它將收到一個(gè) 429的響應(yīng)。你可以根據(jù)自己的需求調(diào)整最大請求數(shù)和時(shí)間段。

需要注意的是,這個(gè)小案例只是簡答實(shí)現(xiàn)了對(duì)IP地址的攔截,在實(shí)際開發(fā)中,我們需要做的東西更加多,考慮的情況也需要更加全面,利用更加復(fù)雜的邏輯和持久化的存儲(chǔ)來處理IP地址的請求限制。

接下來,我們通過Controller類來測試我們的寫的案例是否實(shí)現(xiàn)這個(gè)功能:

@RestController
@RequestMapping("user/")
public class UserController {

    @RequestMapping("demo")
    public String test(){
        return "測試";
    }

    @RequestMapping("userDemo")
    public User userDemo(User user){
        return  user;
    }
}

User其實(shí)可寫可不寫,但是便于重復(fù)利用,我這里給出User的實(shí)體類吧:

public class User {
    private Long id;
    private String name;
    private Integer age;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(id, user.id) && Objects.equals(name, user.name) && Objects.equals(age, user.age);
    }
    @Override
    public int hashCode() {
        return Objects.hash(id, name, age);
    }
    public User() {
    }
    public User(Long id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
}

最終結(jié)果展示:

到此這篇關(guān)于使用Spring Boot限制在一分鐘內(nèi)某個(gè)IP只能訪問10次的文章就介紹到這了,更多相關(guān)springboot限制ip訪問內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論