返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot防止大量请求攻击的实现
  • 887
分享到

SpringBoot防止大量请求攻击的实现

2024-04-02 19:04:59 887人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

我们使用jmeter测试同学的网站时,就会出现网站无法访问,403等错误。 An error occurred. Sorry, the page you are looking f

我们使用jmeter测试同学的网站时,就会出现网站无法访问,403等错误。

An error occurred.

Sorry, the page you are looking for is currently unavailable.

Please try again later.

If you are the system administrator of this resource then you should check the error log for details.

Faithfully yours, Nginx.

所以我们需要加上IP访问时间限制,防止一个IP多次访问请求,导致整个网站崩溃。

自定义注解:


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

自定义拦截器:
我采用了抛出自定义异常的方式来解决相同IP多次访问的问题:
throw new DujiaoshouException(20001,"操作过于频繁");


import com.qykhhr.dujiaoshouservice.exceptionhandler.DujiaoshouException;
import com.qykhhr.dujiaoshouservice.mycomment.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 ;
            Integer count = (Integer) redisTemplate.opsForValue().get(key);

            if (null == count || -1 == count) {
                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 DujiaoshouException(20001,"操作过于频繁");
        }

        return true;
    }
}

在webconfig中配置拦截器


import com.qykhhr.dujiaoshouservice.Interceptor.AccessLimtInterceptor;
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.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebmvcConfigurerAdapter;


@Configuration
public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {

    @Autowired
    private AccessLimtInterceptor accessLimtInterceptor;

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

在Controller前面加上注解就可以生效了


@RestController
public class AppHomeController {

    @GetMapping("/index")
    @AccessLimit(seconds = 1, maxCount = 3) //1秒内 允许请求3次
    public R getImageList(){
        return R.ok().data("appHome","hahaha");
    }
}

使用python发送100次请求,可以发现请求被拦截了多少

在这里插入图片描述

对于注解,我们也可以不使用它,但是我们需要在拦截器中写入固定的参数。

到此这篇关于SpringBoot防止大量请求攻击的实现的文章就介绍到这了,更多相关SpringBoot防止大量请求攻击内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringBoot防止大量请求攻击的实现

本文链接: https://lsjlt.com/news/158082.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringBoot防止大量请求攻击的实现
    我们使用Jmeter测试同学的网站时,就会出现网站无法访问,403等错误。 An error occurred. Sorry, the page you are looking f...
    99+
    2024-04-02
  • springboot防止重复请求防止重复点击的操作
      利用 springboot + redis 实现过滤重复提交的请求,业务流程如下所示,首先定义一个拦截器,拦截需要进行过滤的URL,然后用 session +...
    99+
    2023-01-30
    springboot 重复请求 springboot 重复点击
  • SpringBoot防止XSS注入攻击的方法
    这篇文章将为大家详细讲解有关SpringBoot防止XSS注入攻击的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是 XSS 攻击在跨站脚本(XSS)攻击中,攻击者可以在受害者的浏览器中执行恶意脚...
    99+
    2023-06-15
  • SpringBoot+Redis+Lua防止IP重复防刷攻击的方法
    黑客或者一些恶意的用户为了攻击你的网站或者APP。通过肉机并发或者死循环请求你的接口。从而导致系统出现宕机。 针对新增数据的接口,会出现大量的重复数据,甚至垃圾数据会将你的...
    99+
    2024-04-02
  • SpringBoot防止接口恶意刷新和暴力请求的实现
    在实际项目使用中,必须要考虑服务的安全性,当服务部署到互联网以后,就要考虑服务被恶意请求和暴力攻击的情况,下面的教程,通过intercept和redis针对url+ip在一定时间内访...
    99+
    2024-04-02
  • golang如何实现防止CSRF攻击的功能
    CSRF(Cross-site request forgery)是一种网络攻击技术,攻击者通过伪造用户的请求,达到欺骗服务器的目的。Golang 语言提供了一些工具库和框架,可以帮助我们实现防止 CSRF 攻击的功能。CSRF 基本原理CS...
    99+
    2023-05-14
  • 如何实现防止ARP攻击的shell代码
    小编给大家分享一下如何实现防止ARP攻击的shell代码,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!代码如下:#!/bin/bashdeclare gw=`ro...
    99+
    2023-06-09
  • SpringBoot+Redis防止恶意刷新与暴力请求接口的实现
    目录配置目录结构实现代码本项目采用 springboot+Redis的方式来实现;所采用的全部参考文献在文末,包括软件的安装、测试等等 实验环境: centos 7 安装Redis ...
    99+
    2024-04-02
  • SpringBoot+Redis怎么实现防止恶意刷新与暴力请求接口
    这篇文章主要介绍“SpringBoot+Redis怎么实现防止恶意刷新与暴力请求接口”,在日常操作中,相信很多人在SpringBoot+Redis怎么实现防止恶意刷新与暴力请求接口问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
    99+
    2023-07-02
  • java防止重复数据请求怎么实现
    有多种方法可以实现防止重复数据请求的功能,以下是其中一种常见的做法: 在Java应用中定义一个全局的缓存对象,用于存储已经处理过的...
    99+
    2023-10-23
    java
  • springboot批量请求接口怎么实现
    在Spring Boot中实现批量请求接口可以通过以下步骤实现: 创建一个包含所有待请求的接口URL的列表或数组。 使用Re...
    99+
    2023-10-26
    springboot
  • vue 禁止重复点击发送多次请求的实现
    目录1.通过控制 loading 来设置 loading,或者 disabled2.使用Vue自定义指令3. 使用debounce函数4.最终解决方案lodash某些情况下,为了阻止...
    99+
    2023-03-06
    vue 禁止重复点击 vue 发送多次请求
  • springboot支持https请求的实现
    目录前言一、借助keytools二、详细步骤三、配置spring项目支持https总结前言 众所周知,http是不安全的协议,那么要使服务器支持https,该如何在spring项目中...
    99+
    2023-01-28
    springboot https请求 springboot https
  • vue禁止重复点击发送多次请求如何实现
    本篇内容介绍了“vue禁止重复点击发送多次请求如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!某些情况下,为了阻止用户短时间内重复点击...
    99+
    2023-07-05
  • 美国高防服务器防御大流量攻击的特性是什么
    防御大流量攻击的特性:1. 美国高防服务器对流量有智能化的服务器防火墙分辨牵引带系统软件,攻击流量超出维护的范围就会对IP开展短暂性的牵引带。2. 美国高防服务器置放流量所占区域高宽。具体内容如下:对流量有智能化的服务器防火墙分辨牵引带系统...
    99+
    2024-04-02
  • vue防止多次点击的实现方法
    本篇内容主要讲解“vue防止多次点击的实现方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue防止多次点击的实现方法”吧!一般点击事件会分不同的情况进行消息提醒,如果不做处理,短短几秒弹出很...
    99+
    2023-06-20
  • pythonselenium禁止加载某些请求的实现
    目录问题描述解决方案参考问题描述 通过selenium请求目标网站时候, 真实数据(我这里是验证码图片)已经加载出来, 由于网站做了第三方上报所以得等待很久, 但是上报这个请求不是必...
    99+
    2024-04-02
  • 如何在PHP项目中实现验证码和防止机器人攻击?
    如何在PHP项目中实现验证码和防止机器人攻击?随着互联网的发展和普及,越来越多的网站和应用程序开始受到机器人攻击的威胁。为了保护用户信息安全和提供良好的用户体验,开发人员需要在项目中实现验证码和防止机器人攻击的措施。本文将介绍如何在PHP项...
    99+
    2023-11-03
    验证码 PHP项目 防机器人
  • JavaScript实现可终止轮询请求的方法
    目录什么是轮询请求?轮询的要点setInterval的问题实现轮询准备工作基础版进阶版最终版最近遇到了一个需求,需要每隔5s请求一个接口获取接口返回的结果,返回成功后停止请求,接口的...
    99+
    2024-04-02
  • springboot接受前端请求的方法实现
    目录普通参数get 请求post请求5种不同参数类型的传递普通参数[简单数据]:参数不同名实体类参数属性名里面引用别的属性名数组参数集合类型错误案例报错:解决方法总结首先我们是否用的...
    99+
    2023-01-28
    springboot接受前端请求 springboot 前端请求
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作