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集群)

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

相关文章

  • 基于Maven pom文件中属性变量总结

    基于Maven pom文件中属性变量总结

    这篇文章主要介绍了Maven pom文件中属性变量总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • idea中创建maven的Javaweb工程并进行配置(图文教程)

    idea中创建maven的Javaweb工程并进行配置(图文教程)

    这篇文章主要介绍了idea中创建maven的Javaweb工程并进行配置,本文通过图文并茂的形式给大家介绍的非常详细,文中给大家提到了tomcat的运行方法,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • Java设计模式之桥接模式的实现

    Java设计模式之桥接模式的实现

    今天给大家带来的文章是Java设计模式的相关知识点,文中对桥接模式作了非常详细的介绍及代码示例,对正在学习的小伙伴们很有帮助,需要的朋友可以参考下
    2021-06-06
  • 浅谈spring方法级参数校验(@Validated)

    浅谈spring方法级参数校验(@Validated)

    这篇文章主要介绍了浅谈spring方法级参数校验(@Validated),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • java读取properties配置文件的方法

    java读取properties配置文件的方法

    这篇文章主要介绍了java读取properties配置文件的方法,涉及java操作properties配置文件的相关技巧,需要的朋友可以参考下
    2015-05-05
  • Java Web项目中Spring框架处理JSON格式数据的方法

    Java Web项目中Spring框架处理JSON格式数据的方法

    Spring MVC是个灵活的框架,返回JSON数据的也有很多五花八门的方式,这里我们来整理一个最简单的Java Web项目中Spring框架处理JSON格式数据的方法:
    2016-05-05
  • IDEA使用Maven创建父与子多模块项目的图文教程

    IDEA使用Maven创建父与子多模块项目的图文教程

    在 IntelliJ IDEA 中使用 Maven 创建父与子多模块项目是一个常见的开发实践,有助于更好地组织和管理代码,所以本文小编给大家介绍了IDEA使用Maven创建父与子多模块项目的图文教程,需要的小伙伴跟着小编一起来看看吧
    2025-03-03
  • Spring Cache 最佳实践总结

    Spring Cache 最佳实践总结

    SpringCache是Spring框架提供的声明式缓存抽象层,通过少量注解即可为应用添加缓存能力,无需侵入业务代码,本文给大家介绍Spring Cache 最佳实践总结,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • Java使用Instant时输出的时间比预期少了八个小时

    Java使用Instant时输出的时间比预期少了八个小时

    在Java中,LocalDateTime表示没有时区信息的日期和时间,而Instant表示基于UTC的时间点,本文主要介绍了Java使用Instant时输出的时间比预期少了八个小时的问题解决,感兴趣的可以了解一下
    2024-09-09
  • Mybatis拦截器实现公共字段填充的示例代码

    Mybatis拦截器实现公共字段填充的示例代码

    本文介绍了使用Spring Boot和MyBatis实现公共字段的自动填充功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-12-12

最新评论