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

编程教程 > Java > Spring (783) 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编...
Java编程之spring boot FastDFS Java client使用,Java编程,FastDFS Java客户端
spring boot整合cxf发布webservice服务和cxf客户端调用,说起web service最近几年restful大行其道,大有取代传统soap web service的趋势,但是...
问题环境Spring 中首字母小写,第二个字母大写造成的参数问题在进行前后端的联调时,有时候会出现,前端明明传了值,后端接口却接收不到的情况,这种情况常常让人很
从Spring 6和Spring Boot 3开始,与OpenFeign和Retrofit等其他声明式客户端类似,Spring框架支持以Java接口的形式创建RSocket服务,并为RSocke...
获取客户端来源真实ip在很多业务场景都需要,比如微信支付的v2版,要求必须有下单的用户来源IP。下面详解。 从Java代码端获取真实客户端IP源码参考: pub
Spring boot JPA MySQL整合实现CRUD REST接口,在这篇文章中,我们将为简单的笔记应用程序构建一个Restful CRUD API。注释可以有标题和一些内容。我们将首先...
从Spring 6和Spring Boot 3开始,Spring framework支持将远程HTTP服务代理为带有HTTP交换注解方法的Java接口。类似的库,如OpenFeign和Retro...
spring boot RPC 框架 Hessian,本文主要讲解spring boot整合hessian实现Spring boot RPC调用和Spring boot rpc框架hessian...
spring boot RedisTemplateHelper import org.springframework.context.annotation.Bean; import org.s...
Spring boot hessian 通讯加密,Spring boot hessian RPC框架通讯之间的加密验证。实现安全的RPC访问
Java编程之spring boot shiro redis整合基于角色和权限的安全管理,Java编程,spring boot,shiro,权限控制
Java编程之Spring Boot通过JMSTemplate 整合ActiveMQ
Java编程中spring boot项目动态添加拦截器Interceptor