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

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

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

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

實(shí)驗(yà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)

因?yàn)橹粶y(cè)試了一個(gè)接口暴力請(qǐng)求,所以并沒有分包,對(duì)于全局異常只是在后臺(tái)拋出,并沒有在前端做全局的捕獲返回

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

application.yml配置類

實(shí)現(xiàn)代碼

文章中用到的六個(gè)類包括啟動(dòng)類如下所示:

package com.ApiTest;

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

/**
 * 自定義注解,用于攔截過于頻繁的請(qǐng)求
 */
@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鍵對(duì)應(yīng)的值。
            Integer count = (Integer) redisTemplate.opsForValue().get(key);
            System.out.println(count);
            if (null == count || -1 == count) {
                //redisTemplate.opsForValue().set  增?個(gè)字符串類型的值,key是鍵,value是值。
                //?法含義:新增?個(gè)字符串類型的值,并且設(shè)置變量值的過期時(shí)間。key是鍵,value是值,timeout 過期時(shí)間,unit 過期時(shí)間單位
                //鏈接:https://wenku.baidu.com/view/f0de3ecc1ae8b8f67c1cfad6195f312b3169ebd1.html
                System.out.println("初次進(jìn)入");
                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 請(qǐng)求過于頻繁請(qǐng)稍后再試
            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) 允許請(qǐng)求5次
    @ResponseBody
    public String getImageList(){
        return "請(qǐng)求成功";
    }
}
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防止惡意刷新與暴力請(qǐng)求接口的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot防止惡意刷新 暴力請(qǐng)求接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文掌握Springboot集成RabbitMQ的方法

    一文掌握Springboot集成RabbitMQ的方法

    RabbitMQ是開源的消息隊(duì)列服務(wù)器,實(shí)現(xiàn)了AMQP高級(jí)消息隊(duì)列協(xié)議標(biāo)準(zhǔn),AMQP?是一種應(yīng)用層協(xié)議,為面向消息的中間件設(shè)計(jì),基于此協(xié)議的客戶端與消息中間件可傳遞消息,并不受產(chǎn)品、開發(fā)語(yǔ)言等條件的限制,這篇文章主要介紹了Springboot集成RabbitMQ的過程,需要的朋友可以參考下
    2024-04-04
  • Java實(shí)現(xiàn)冒泡排序算法及對(duì)其的簡(jiǎn)單優(yōu)化示例

    Java實(shí)現(xiàn)冒泡排序算法及對(duì)其的簡(jiǎn)單優(yōu)化示例

    這篇文章主要介紹了Java實(shí)現(xiàn)冒泡排序算法及對(duì)其的簡(jiǎn)單優(yōu)化示例,冒泡排序的最差時(shí)間復(fù)雜度為O(n^2),最優(yōu)時(shí)間復(fù)雜度為O(n),存在優(yōu)化的余地,需要的朋友可以參考下
    2016-05-05
  • Java實(shí)戰(zhàn)項(xiàng)目 醫(yī)院預(yù)約掛號(hào)系統(tǒng)

    Java實(shí)戰(zhàn)項(xiàng)目 醫(yī)院預(yù)約掛號(hào)系統(tǒng)

    本文是一個(gè)Java語(yǔ)言編寫的實(shí)戰(zhàn)項(xiàng)目,是一個(gè)醫(yī)院預(yù)約掛號(hào)系統(tǒng),主要用到了jdbc+jsp+mysql+ajax等技術(shù),技術(shù)含量比較高,感興趣的童鞋跟著小編往下看吧
    2021-09-09
  • java漢字轉(zhuǎn)拼音工具類分享

    java漢字轉(zhuǎn)拼音工具類分享

    這篇文章主要為大家詳細(xì)介紹了java漢字轉(zhuǎn)拼音工具類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • JavaWeb ServletConfig作用及原理分析講解

    JavaWeb ServletConfig作用及原理分析講解

    ServletConfig對(duì)象,叫Servlet配置對(duì)象。主要用于加載配置文件的初始化參數(shù)。我們知道一個(gè)Web應(yīng)用里面可以有多個(gè)servlet,如果現(xiàn)在有一份數(shù)據(jù)需要傳給所有的servlet使用,那么我們就可以使用ServletContext對(duì)象了
    2022-10-10
  • Session過期后實(shí)現(xiàn)自動(dòng)跳轉(zhuǎn)登錄頁(yè)面

    Session過期后實(shí)現(xiàn)自動(dòng)跳轉(zhuǎn)登錄頁(yè)面

    這篇文章主要介紹了Session過期后實(shí)現(xiàn)自動(dòng)跳轉(zhuǎn)登錄頁(yè)面,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 一文帶你輕松掌握EasyExcel的使用技巧

    一文帶你輕松掌握EasyExcel的使用技巧

    EasyExcel是一個(gè)基于Java的、快速、簡(jiǎn)潔、解決大文件內(nèi)存溢出的Excel處理工具,這篇文章就來帶大家深入了解EasyExcel的使用技巧,需要的可以參考一下
    2023-06-06
  • 詳談Java中的事件監(jiān)聽機(jī)制

    詳談Java中的事件監(jiān)聽機(jī)制

    下面小編就為大家?guī)硪黄斦凧ava中的事件監(jiān)聽機(jī)制。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • Springboot 整合通用mapper和pagehelper展示分頁(yè)數(shù)據(jù)的問題(附github源碼)

    Springboot 整合通用mapper和pagehelper展示分頁(yè)數(shù)據(jù)的問題(附github源碼)

    這篇文章主要介紹了Springboot 整合通用mapper和pagehelper展示分頁(yè)數(shù)據(jù)(附github源碼),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Java?數(shù)據(jù)庫(kù)連接池Druid?的介紹

    Java?數(shù)據(jù)庫(kù)連接池Druid?的介紹

    這篇文章主要給大家分享的是?Java?數(shù)據(jù)庫(kù)連接池Druid?的介紹,Druid是一個(gè)JDBC組件,它包括三部分:?DruidDriver?代理Driver,能夠提供基于Filter-Chain模式的插件體系。?DruidDataSource?高效可管理的數(shù)據(jù)庫(kù)連接池,下面來看看文中的詳細(xì)內(nèi)容,需要的朋友也可以參考一下
    2021-11-11

最新評(píng)論

政和县| 宁德市| 拜泉县| 宜兰市| 木兰县| 永春县| 岑溪市| 武威市| 白河县| 蒲城县| 通海县| 临高县| 大渡口区| 萨嘎县| 麦盖提县| 凤台县| 乌拉特后旗| 漯河市| 宁化县| 航空| 汾西县| 斗六市| 崇左市| 洱源县| 上思县| 萝北县| 江油市| 宜黄县| 伽师县| 汝阳县| 屯留县| 上思县| 拉孜县| 遵化市| 阳江市| 关岭| 紫金县| 时尚| 博兴县| 平利县| 嵊泗县|