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

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

相关文章

  • jmeter的时间戳函数使用

    jmeter的时间戳函数使用

    在使用jmeter做接口测试的时候,经常会要用到日期这种函数,本文主要介绍了jmeter的时间戳函数使用,感兴趣的可以了解一下
    2021-11-11
  • Spring Boot 定制URL匹配规则的方法

    Spring Boot 定制URL匹配规则的方法

    本篇文章主要介绍了Spring Boot 定制URL匹配规则的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Java实现添加文字水印&图片水印的方法详解

    Java实现添加文字水印&图片水印的方法详解

    为图片添加水印的主要作用是保护图片版权,防止图片被未经授权的人使用或传播。本文为大家介绍了Java实现添加文字水印&图片水印的具体方法,需要的可以参考一下
    2023-02-02
  • Java修改eclipse中web项目的server部署路径问题

    Java修改eclipse中web项目的server部署路径问题

    这篇文章主要介绍了Java修改eclipse中web项目的server部署路径,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Jmeter内置变量vars和props的使用详解

    Jmeter内置变量vars和props的使用详解

    JMeter是一个功能强大的负载测试工具,它提供了许多有用的内置变量来支持测试过程,其中最常用的变量是 vars 和 props,本文通过代码示例详细给大家介绍了Jmeter内置变量vars和props的使用,需要的朋友可以参考下
    2024-08-08
  • Mybatis分页插件PageHelper配置及使用方法详解

    Mybatis分页插件PageHelper配置及使用方法详解

    这篇文章主要介绍了Mybatis分页插件PageHelper配置及使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 很简单的Java断点续传实现原理

    很简单的Java断点续传实现原理

    这篇文章主要以实例的方式为大家详细介绍了简单的Java断点续传实现原理,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • SpringShell命令行之交互式Shell应用开发方式

    SpringShell命令行之交互式Shell应用开发方式

    本文将深入探讨Spring Shell的核心特性、实现方式及应用场景,帮助开发者掌握这一强大工具,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Struts2实现文件上传时显示进度条功能

    Struts2实现文件上传时显示进度条功能

    这篇文章主要为大家详细介绍了Struts2实现文件上传时显示进度条功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • SpringMvc根据返回值类型不同处理响应的方法

    SpringMvc根据返回值类型不同处理响应的方法

    这篇文章主要介绍了SpringMvc根据返回值类型不同处理响应,我们可以通过控制器方法的返回值设置跳转的视图,控制器支持如void,String,ModelAndView类型,需要的朋友可以参考下
    2023-09-09

最新评论