SpringBoot+Redis防止接口重复提交问题

 更新时间:2025年06月20日 11:25:49   作者:°Fuhb  
这篇文章主要介绍了SpringBoot+Redis防止接口重复提交问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

前言

在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。

例如:用户鼠标点击过快而重复保存,从而创建了2笔一模一样的单据。针对类似情况,我们就可以全局地控制接口不允许重复提交。

实现思路

  • 创建拦截器 Interceptor,拦截所有API请求
  • 将用户唯一标识(token或者jsessionid)+接口地址进行拼接,作为后续步骤的 redis-key
  • 判断Redis是否存在该key值,存在说明重复提交,不存在就存入Redis,过期时间1秒

代码示例

  • 创建拦截器 RepeatSubmitInterceptor
@Component
public class RepeatSubmitInterceptor extends HandlerInterceptorAdapter {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    //防重时间间隔(秒)
    private final int duration = 1;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (request.getDispatcherType() == DispatcherType.ERROR){
            return true;
        }
        String token = request.getHeader("token");
        String lockKey = "RepeatSubmit:" + token + ":" + request.getServletPath();
        Boolean result = stringRedisTemplate.opsForValue().setIfAbsent(lockKey, "", duration, TimeUnit.SECONDS);
        if (!result){
            throw new Exception("请勿重复提交");
        }

        return true;
    }
}
  • 注入拦截器
@Configuration
public class MvcConfig implements WebMvcConfigurer {

    @Autowired
    private RepeatSubmitInterceptor repeatSubmitInterceptor;

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

测试

建个 controller 并创建个简单的测试接口,打开 postman 快速点击2次请求,结果如下:

总结

这边只是提供一种简单的方案,还可以有其他扩展,例如:

  • 增加参数的校验,只做相同参数的重复判定,参数不同可以重复提交
  • 增加AOP自定义注解,只有注解标识的接口才会重复判定
  • 使用Session替代Redis进行存储和校验(不适用于tomcat集群)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java调用bat执行python脚本方式

    Java调用bat执行python脚本方式

    文章介绍了如何在Windows环境下通过Java调用bat文件来执行Python脚本,并解决了执行过程中出现的中文乱码问题,具体方法是修改bat文件的编码格式为ANSI,这样可以确保中文路径不会因编码问题而导致路径错误
    2025-10-10
  • Java排序算法总结之选择排序

    Java排序算法总结之选择排序

    这篇文章主要介绍了Java排序算法总结之选择排序,较为详细的分析了选择排序的原理与java实现技巧,需要的朋友可以参考下
    2015-05-05
  • Spring Data JPA 实体类中常用注解说明

    Spring Data JPA 实体类中常用注解说明

    这篇文章主要介绍了Spring Data JPA 实体类中常用注解说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java对接Dify API接口的完整流程

    Java对接Dify API接口的完整流程

    Dify是一款AI应用开发平台,提供多种自然语言处理能力,通过调用Dify开放API,开发者可以快速集成智能对话、文本生成等功能到自己的Java应用中,本文给大家介绍了Java对接Dify API接口的完整流程,需要的朋友可以参考下
    2025-05-05
  • Java实现JDK动态代理的原理详解

    Java实现JDK动态代理的原理详解

    这篇文章主要介绍了Java实现JDK动态代理的原理详解,Java常用的动态代理模式有JDK动态代理,也有cglib动态代理,本文重点讲解JDK的动态代理,需要的小伙伴可以参考一下的相关资料
    2022-07-07
  • Eclipse中配置Maven build打包的方法步骤

    Eclipse中配置Maven build打包的方法步骤

    这篇文章主要介绍了Eclipse中配置Maven build打包的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • SpringBoot 文件或图片上传与下载功能的实现

    SpringBoot 文件或图片上传与下载功能的实现

    这篇文章主要介绍了SpringBoot 文件或图片上传与下载功能的实现,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 详解三种java实现多线程的方式

    详解三种java实现多线程的方式

    数据时代的到来,多线程一直都是比较关心的问题之一,这篇文章介绍了JAVA实现多线程的三种方法,有需要的朋友可以参考一下
    2015-08-08
  • dubbo集成zipkin获取Traceid的实现

    dubbo集成zipkin获取Traceid的实现

    这篇文章主要介绍了dubbo集成zipkin获取Traceid的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java动态获取实现类的方式详解

    Java动态获取实现类的方式详解

    这篇文章主要介绍了Java动态获取实现类的方式详解,文中通过示例代码介绍的非常详细,对大家的学习或工作有一定的参考价值,需要的朋友们下面随着小编来一起学习吧
    2024-01-01

最新评论