spring boot + redis 接口/表单防抖实现

编程教程 > Java > Spring (792) 2025-03-28 18:00:41

思路

通过redis的有效期和切面来配合处理

环境

  1. spring boot 2.7.x
  2. spring-boot-starter-web
  3. spring-boot-starter-aop
  4. java 1.8
  5. redis

编写注解

/**
 * 标记为防抖处理接口(注意需要先满足登录)
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Debounce {

    /**
     * 定义防抖key
     * @return
     */
    String key() default "";

    /**
     * 防抖时间,默认1s
     * @return
     */
    long ms() default 1000;

}

说明:上面注解用于需要防抖的接口方法上。注解实用和写法更多可参考:

编写AOP拦截处理防抖逻辑

 

@Slf4j
@Aspect
@Component
public class DebounceAspect {


    @Around("@annotation(com.xx.annotation.Debounce)")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method targetMethod = methodSignature.getMethod();

        Long userId = Global.getUserId();
        /**
         * 防抖
         */
        Debounce debounce = targetMethod.getAnnotation(Debounce.class);
        String clazzName = targetMethod.getDeclaringClass().getSimpleName();
        String name = clazzName.replace(".","_")+"_"+targetMethod.getName();
        String key = StrUtil.isEmpty(debounce.key())? name+":"+userId: name+":"+userId+":"+debounce.key();
        String cacheKey = RedisKeyGenerator.debounceKey(key);
        boolean exists = RedisTemplateHelper.exists(cacheKey);
        if (exists){
            throw new BusinessException(8899,"操作频繁,请稍后再试:"+name);
        }
        RedisTemplateHelper.setMs(cacheKey,cacheKey,debounce.ms());
        return joinPoint.proceed();
    }
}

 

说明:

上面处理中通过Global.getUserId()获取了当前登录用户的id,你根据自己实际获取登录用户ID方式获取即可。

key的生成,key核心部分就是 获取的 className (类名) + 方法名 + 用户id组成

key生成后存放到redis里面并设定过期时间,过期时间来源于注解@Debounce的配置

判断逻辑:每次组合key,然后去redis判断是否存在,存在则表示操作频繁,这里就添加了一个异常。不存在则正常访问。

 

以上逻辑编写好以后,可以通过接口文档频繁点击测试:

防抖测试
防抖测试

 


评论
User Image
提示:请评论与当前内容相关的回复,广告、推广或无关内容将被删除。

相关文章
思路通过redis的有效期和切面来配合处理环境springboot2.7.xspring-boot-starter-webspring-boot-starter-aopjava1.8redis编...
Bootstrap Table 后端分页详解防坑$('#tableId').bootstrapTable({ method:'post',//请求方法 url:'',//后台地址 p...
Java编程之spring boot FastDFS Java client使用,Java编程,FastDFS Java客户端
前言首先讲讲IM(即时通讯)技术可以用来做什么:聊天:qq、微信直播:斗鱼直播、抖音实时位置共享、游戏多人互动等等可以说几乎所有高实时性的应用场景都需要用到IM
获取客户端来源真实ip在很多业务场景都需要,比如微信支付的v2版,要求必须有下单的用户来源IP。下面详解。 从Java代码端获取真实客户端IP源码参考: pub
spring boot RedisTemplateHelper import org.springframework.context.annotation.Bean; import org.s...
1.vue项目中创建global.js创建global.js放于main.js同级目录(可自己随意放)export default {   getToken()   {     retur...
问题环境Spring 中首字母小写,第二个字母大写造成的参数问题在进行前后端的联调时,有时候会出现,前端明明传了值,后端接口却接收不到的情况,这种情况常常让人很
spring boot整合cxf发布webservice服务和cxf客户端调用,说起web service最近几年restful大行其道,大有取代传统soap web service的趋势,但是...
Spring boot JPA MySQL整合实现CRUD REST接口,在这篇文章中,我们将为简单的笔记应用程序构建一个Restful CRUD API。注释可以有标题和一些内容。我们将首先...
Java编程之Spring Boot通过JMSTemplate 整合ActiveMQ
Java编程中Spring Boot整合RabbitMQ实现消息中间件RabbitMQ的使用 1 主要用spring-boot-starter-amqp来整合R
1.概要在本Spring boot教程中,我们将学习如何验证发送到PUT/POST API请求的数据BODY
Spring Boot MQTT协议通过spring boot整合apache artemis实现Java语言MQTT协议通信,搭建MQTT服务器可以参考上一篇 MQTT Java入门-搭建MQ...
从Spring 6和Spring Boot 3开始,与OpenFeign和Retrofit等其他声明式客户端类似,Spring框架支持以Java接口的形式创建RSocket服务,并为RSocke...