欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot+Redis防止惡意刷新與暴力請求接口的實現(xiàn)

 更新時間:2022年06月07日 11:31:43   作者:凌晨里的無聊人  
這篇文章主要為大家介紹了如何利用springboot和Redis來實現(xiàn)防止惡意刷新與暴力請求接口,文中的示例代碼講解詳細(xì),需要的可以參考一下

本項目采用 springboot+Redis的方式來實現(xiàn);所采用的全部參考文獻在文末,包括軟件的安裝、測試等等

實驗環(huán)境: centos 7 安裝Redis ,采用wget安裝,

IDE :IDEA

配置

pom文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>springbootRefusePost</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.3.0.RELEASE</version>
        </dependency>


        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.67</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.13.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.3.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.3.3.RELEASE</version>
        </dependency>
    </dependencies>

</project>

目錄結(jié)構(gòu)

因為只測試了一個接口暴力請求,所以并沒有分包,對于全局異常只是在后臺拋出,并沒有在前端做全局的捕獲返回

飄紅的原因是idea的受檢異常,可忽略

application.yml配置類

實現(xiàn)代碼

文章中用到的六個類包括啟動類如下所示:

package com.ApiTest;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定義注解,用于攔截過于頻繁的請求
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AccessLimit {
    int seconds();
    int maxCount();
    boolean needLogin() default true;
}
package com.ApiTest;

import com.ApiTest.MyException;
import com.ApiTest.AccessLimit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.concurrent.TimeUnit;

/**
 * 自定義攔截器
 */
@Component
public class AccessLimtInterceptor implements HandlerInterceptor {

    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        if (handler instanceof HandlerMethod) {
            HandlerMethod hm = (HandlerMethod) handler;
            AccessLimit accessLimit = hm.getMethodAnnotation(AccessLimit.class);
            if (null == accessLimit) {
                return true;
            }
            int seconds = accessLimit.seconds();
            int maxCount = accessLimit.maxCount();
            boolean needLogin = accessLimit.needLogin();

            if (needLogin) {
                //判斷是否登錄
            }
            String ip=request.getRemoteAddr();
            String key = request.getServletPath() + ":" + ip ;
            System.out.println(ip);
            System.out.println(key);
            //獲取key鍵對應(yīng)的值。
            Integer count = (Integer) redisTemplate.opsForValue().get(key);
            System.out.println(count);
            if (null == count || -1 == count) {
                //redisTemplate.opsForValue().set  增?個字符串類型的值,key是鍵,value是值。
                //?法含義:新增?個字符串類型的值,并且設(shè)置變量值的過期時間。key是鍵,value是值,timeout 過期時間,unit 過期時間單位
                //鏈接:https://wenku.baidu.com/view/f0de3ecc1ae8b8f67c1cfad6195f312b3169ebd1.html
                System.out.println("初次進入");
                redisTemplate.opsForValue().set(key, 1,seconds, TimeUnit.SECONDS);
                return true;
            }

            if (count < maxCount) {
                count = count+1;
                //?法含義:覆蓋從指定位置開始的值
                redisTemplate.opsForValue().set(key, count,0);
                return true;
            }
            //  response 返回 json 請求過于頻繁請稍后再試
            throw new MyException("20001","操作過于頻繁");
        }

        return true;
    }
}
package com.ApiTest;

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

@RestController
public class AppHomeController {


    @GetMapping("/index")
    @AccessLimit(seconds = 2, maxCount = 5) //2秒內(nèi) 允許請求5次
    @ResponseBody
    public String getImageList(){
        return "請求成功";
    }
}
package com.ApiTest;

/**
 * 自定義異常類
 */
public class MyException extends Exception {
    // 異常代碼
    private String code;

    //異常信息
    private String message;

    //構(gòu)造方法


    public MyException(String code, String message) {
        this.code = code;
        this.message = message;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    @Override
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }


}
package com.ApiTest;
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.WebMvcConfigurerAdapter;

/**
 * 在webconfig中配置攔截器
 */
@Configuration
public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {

    @Autowired
    private AccessLimtInterceptor accessLimtInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(accessLimtInterceptor);
        super.addInterceptors(registry);
    }
}


```java
package com;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class Application {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

到此這篇關(guān)于SpringBoot+Redis防止惡意刷新與暴力請求接口的實現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot防止惡意刷新 暴力請求接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中的ScheduledThreadPoolExecutor定時任務(wù)詳解

    Java中的ScheduledThreadPoolExecutor定時任務(wù)詳解

    這篇文章主要介紹了Java中的ScheduledThreadPoolExecutor詳解,??ScheduledThreadPoolExecutor?繼承自?ThreadPoolExecutor,它主要用來在給定的延遲之后運行任務(wù),或者定期執(zhí)行任務(wù),ScheduledThreadPoolExecutor?的功能與?Timer?類似<BR>,需要的朋友可以參考下
    2023-12-12
  • Android?Studio中創(chuàng)建java工程的完整步驟

    Android?Studio中創(chuàng)建java工程的完整步驟

    Android?Studio創(chuàng)建java工程是非常麻煩的,因為Android?Studio沒有提供直接創(chuàng)建java工程的方法,下面這篇文章主要給大家介紹了關(guān)于Android?Studio中創(chuàng)建java工程的完整步驟,需要的朋友可以參考下
    2024-01-01
  • 在idea中使用JaCoCo插件統(tǒng)計單元測試覆蓋率的實現(xiàn)

    在idea中使用JaCoCo插件統(tǒng)計單元測試覆蓋率的實現(xiàn)

    這篇文章主要介紹了在idea中使用JaCoCo插件統(tǒng)計單元測試覆蓋率的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Spring輕松解決循環(huán)依賴

    Spring輕松解決循環(huán)依賴

    Spring的解決循環(huán)依賴是有前置條件的,要解決循環(huán)依賴我們首先要了解Spring Bean對象的創(chuàng)建過程和依賴注入的方式。依賴注入方式,我之前的博客有所分享,大家可以在看本篇文章之前進行一下小小的回顧
    2023-04-04
  • IDEA如何將右下角提示框禁止彈出問題

    IDEA如何將右下角提示框禁止彈出問題

    這篇文章主要介紹了IDEA如何將右下角提示框禁止彈出問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • java中常見的死鎖以及解決方法代碼

    java中常見的死鎖以及解決方法代碼

    這篇文章主要介紹了java中常見的死鎖以及解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Spring Boot XSS 攻擊過濾插件使用

    Spring Boot XSS 攻擊過濾插件使用

    這篇文章主要介紹了Spring Boot XSS 攻擊過濾插件使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • 淺析Java內(nèi)部類——成員內(nèi)部類

    淺析Java內(nèi)部類——成員內(nèi)部類

    這篇文章主要介紹了Java 成員內(nèi)部類的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java 內(nèi)部類的相關(guān)知識,感興趣的朋友可以了解下
    2020-08-08
  • Java 遞歸查詢部門樹形結(jié)構(gòu)數(shù)據(jù)的實踐

    Java 遞歸查詢部門樹形結(jié)構(gòu)數(shù)據(jù)的實踐

    本文主要介紹了Java 遞歸查詢部門樹形結(jié)構(gòu)數(shù)據(jù)的實踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java IO流相關(guān)知識代碼解析

    Java IO流相關(guān)知識代碼解析

    這篇文章主要介紹了Java IO流相關(guān)知識代碼解析,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12

最新評論