发送短信验证码过于频繁问题的解决

2023-05-16

1.对请求的接口做了一个限流的控制,

2.利用到:AOP,redis,定时器;

3.在请求的congtroller层上加相应的注解就可以;

具体的Demo工程如下


package com.weigu.xiaochuang.project;

import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

//https://blog.csdn.net/befroe_You/article/details/83748927
@Aspect
@Component
@Slf4j
public class RequestLimitContract {
    private Map<String, Integer> redisTemplate = Maps.newHashMap();

    @Before("within(@org.springframework.stereotype.Controller *)&& @annotation(limit)")

    public void requestLimit(final JoinPoint joinPoint, RequestLimit limit) throws RequestLimitException {
        try {
            Object[] args = joinPoint.getArgs();
            HttpServletRequest request = null;
            for (int i = 0; i < args.length; i++) {
                if (args[i] instanceof HttpServletRequest) {
                    request = (HttpServletRequest) args[i];
                    break;
                }
            }
            /**
             * 将请求参数转变为request
             */
            if (request == null) {
                throw new RequestLimitException("方法中缺失HttpServletRequest参数");
            }
            String ip = request.getLocalAddr();
            String url = request.getRequestURI().toString();
            String key = "req_limit".concat(ip).concat(url);
            if (redisTemplate.get(key) == null || redisTemplate.get(key) == 0) {
                redisTemplate.put(key, 1);
            } else {
                redisTemplate.put(key, redisTemplate.get(key) + 1);
            }
            Integer count = redisTemplate.get(key);
            if (count > 0) {
                //创建一个定时器
                Timer timer = new Timer();
                TimerTask timerTask = new TimerTask() {
                    @Override
                    public void run() {
                        redisTemplate.remove(key);
                    }
                };
                //这个定时器设定在time规定的时间之后会执行上面的remove方法,也就是说在这个时间后它可以重新访问
                timer.schedule(timerTask, limit.time());
            }
            if (count > limit.count()) {
                log.info("用户IP[" + ip + "]访问地址[" + url + "]超过了限定的次数[" + limit.count() + "]");
                throw new RequestLimitException();
            }
        }catch (RequestLimitException e){
            throw  e;
        }catch (Exception e){

        }
    }
}
  

 


package com.weigu.xiaochuang.project;

import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
@Order(Ordered.HIGHEST_PRECEDENCE)
public @interface RequestLimit {
    /**
     * 允许访问最大次数
     */
    int count() default Integer.MAX_VALUE;

    /**
     * 时间段
     */
    long time() default 6000;
}
  

package com.weigu.xiaochuang.project;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;

@Controller
public class testController {
    @RequestMapping("/hello")
    @RequestLimit(count = 4, time = 60000)
    public String test(HttpServletRequest request) {
        return "hello1111";
    }
}

  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

发送短信验证码过于频繁问题的解决 的相关文章

随机推荐

  • idea控制台乱码问题

    idea控制台乱码问题 在环境变量上增加 JAVA TOOL OPTIONS 61 Dfile encoding 61 UTF8 然后idea重新打开即可
  • 如何清除/重置一枚NFC标签教程

    如果您的NFC标签已经写入了数据 xff0c 然后您又想把他清除或者重置 xff0c 请按照如下教程 1 首先下载APP xff0c TagWriter xff0c 这是芯片厂商NXP官方推出的APP xff0c 可以说是最权威的 xff0
  • 树莓派系列教程:红外遥控

    网上淘到了一个红外接收器 xff08 HX1838 43 NEC编码红外遥控器 xff09 和一个红外遥控器 xff0c 准备放到树莓派上学习一下红外控制 img http dl2 iteye com upload attachment 0
  • JavaFX Alert对话框

    1 标准对话框 消息对话框 br Alert alert 61 new Alert AlertType INFORMATION br alert setTitle 34 Information Dialog 34 br alert setH
  • 操作系统原理与实践5--内核栈切换的进程切换

    基于内核栈切换的进程切换 难度系数 xff1a 实验目的 深入理解进程和进程切换的概念 xff1b 综合应用进程 CPU管理 PCB LDT 内核栈 内核态等知识解决实际问题 xff1b 开始建立系统认识 实验内容 现在的Linux 0 1
  • 陀螺仪、加速计、磁力计等传感器汇总

    陀螺仪就是内部有一个陀螺 xff0c 它的轴由于陀螺效应始终与初始方向平行 xff0c 这样就可以通过与初始方向的偏差计算出实际方向 手机里陀螺仪实际上是一个结构非常精密的芯片 xff0c 内部包含超微小的陀螺 加速计是用来检测手机受到的加
  • STM32 HAL库串口+DMA接收不定长数据

    在串口通信中 xff0c 很多时候我们需要的是接收一帧不确定长度的数据 xff0c 而不是单个字节或者固定长度 xff0c 这时我们就需要利用STM32的空闲中断 xff08 IDLE xff09 来实现不定长数据的接收 xff0c 首先我
  • cmake学习之道

    cmke命令格式 cmake 选项 路径 最主要的选项 D 添加变量及值 使用案列 xff08 cmake D ARM BUILD 61 1 xff09 表示在当前路径执行Cmake命令并将ARM BUILD的值传到CMakeLists t
  • 20230312在Ubuntu18.04下的安装Chrome

    20230312在Ubuntu18 04下的安装Chrome 2023 3 12 23 42 百度搜索 xff1a chrome ubuntu 参考资料 xff1a https blog csdn net howard2005 articl
  • ubuntu下查看服务器的CPU详细情况(分色排版)

    https www cnblogs com liuq p 5623565 html 全面了解 Linux 服务器 1 查看 Linux 服务器的 CPU 详细情况 ubuntu下查看服务器的CPU详细情况 大文实验室 大文哥 壹捌陆捌零陆捌
  • 为什么.h文件中只能申明不能定义全局变量

    最近使用keil编写下位机单片机程序 xff0c 打算进行模块化的设计 xff0c 遇到了在 h文件中定义全局变量报错的问题 原因 因为C语言的include是直接将文件嵌入到include这个地方的 如果多次包含这个头文件 xff0c 就
  • 跨系统传递 traceId(日志)

    34 新项目查日志太麻烦 xff0c 多台机器之间查来查去 xff0c 还不知道是不是同一个请求的 打印日志时使用 MDC 在日志上添加一个 traceId xff0c 那这个 traceId 如何跨系统传递呢 xff1f 34 1 背景
  • ThreadLocal 适合用在哪些实际生产的场景中?

    在通常的业务开发中 xff0c ThreadLocal有两种典型的使用场景 场景1 xff0c ThreadLocal 用作保存每个线程独享的对象 xff0c 为每个线程都创建一个副本 xff0c 这样每个线程都可以修改自己所拥有的副本 而
  • SpringCloud 分布式事务组件之Seata

    目录 背景介绍什么是分布式事务什么叫做逆向补偿呢互联网最流行的分布式事务组件seata总结 背景 大家好 xff0c 今天给大家分享一个在2022年出去面试Java几乎必问的一个技术 xff0c 那就是seata 什么 xff1f xff1
  • 接口优化方案

    1 批量思想 xff1a 批量操作数据库 优化前 xff1a for循环单笔入库 for TransDetail detail transDetailList insert detail 优化后 xff1a batchInsert tran
  • springboot前端传一个对象后台怎么接受

    34 courseId 34 3 34 userId 34 34 1234456676 34 34 list 34 34 id 34 34 1 34 34 answer 34 34 B 34 34 id 34 34 1 34 34 answ
  • 前端传一个数组或者集合后台怎么接受

    34 id 34 34 1 34 34 answer 34 34 A 34 34 id 34 34 1 34 34 answer 34 34 A 34 这样的可以直接用一个 64 RequesBody List lt QuestionBac
  • Java8处理List的双层循环

    Java处理List的双层循环程序员经常遇到 xff0c 一般都是当两个List某个值满足某条件时候 xff0c 进行相应的处理 xff1b 1 list和map之间的相互转换 两个List对象当id相同的时候 注意是两个对象 而非两个集合
  • java如何抛出异常

    1 什么时候抛出异常 如果你觉得某些 问题 解决不了了 xff0c 那么你就可以抛出异常了 比如 xff0c 你在写一个service 其中在写到某段代码处 你发现可能会产生问题 xff0c 那么就请抛出异常吧 xff0c 相信我 xff0
  • 发送短信验证码过于频繁问题的解决

    1 对请求的接口做了一个限流的控制 2 利用到 AOP redis 定时器 3 在请求的congtroller层上加相应的注解就可以 具体的Demo工程如下 package com weigu xiaochuang project impo