当前位置: 首页 > news >正文

SpringBoot项目防止接口重复提交(简单拦截器实现方案)

基于SpringBoot框架来开发业务后台项目时,接口重复提交是一个常见的问题。为了避免这个问题,我们可以通过自定义拦截器实现一个后台拦截接口重复提交的功能,本文将介绍如何使用基于SpringBoot实现这个功能。

  1. 首先,我们需要引入一个Aop依赖。在pom.xml文件中添加如下依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
  1. 创建一个自定义注解@NoRepeatSubmit,用于标记需要拦截的接口:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NoRepeatSubmit {/*** 设置请求锁定时间,默认为5秒*/int lockTime() default 5;
}
  1. 创建一个拦截器类NoRepeatSubmitInterceptor,实现HandlerInterceptor接口,并在其中实现拦截逻辑:
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.UUID;
import java.util.concurrent.TimeUnit;@Aspect
@Component
public class NoRepeatSubmitInterceptor implements HandlerInterceptor {@Pointcut("@annotation(com.example.demo.annotation.NoRepeatSubmit)")public void noRepeatSubmitPointcut() {}@Around("noRepeatSubmitPointcut()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {// 获取请求参数中的token值HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();HttpSession session = request.getSession();String token = session.getAttribute("token").toString();// 判断是否已经提交过请求,如果已经提交过并且时间间隔小于锁时间,则直接返回成功结果,否则认为是重复提交,抛出异常并锁定sessionif (isSubmitted(token)) {String lockKey = UUID.randomUUID().toString();session.setAttribute(lockKey, System.currentTimeMillis());throw new RuntimeException("请勿重复提交");} else {session.setAttribute("token", token);return joinPoint.proceed();}}private boolean isSubmitted(String token) {HttpSession session = request.getSession();Object lockKey = session.getAttribute(token);if (lockKey == null) {return false;} else {long lockTime = (Long) session.getAttribute(token);if (lockTime > 0 && System.currentTimeMillis() - lockTime < TimeUnit.SECONDS.toMillis(5)) {return true;} else {session.removeAttribute(token);return false;}}}
}
  1. 注册拦截器

实现HandlerInterceptor接口的重写,重写preHandle、postHandle、afterCompletion方法。拦截器中的方法执行流程为 preHandle → controlle → postHandle → afterCompletion。然后需要将拦截器注册到容器中,可以通过实现WebMvcConfigurer的addInterceptors方法来实现。下面是一个简单的例子:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new NoRepeatSubmitInterceptor()).addPathPatterns("/**").excludePathPatterns("/login", "/register");}
}
  1. 在需要进行拦截的接口上添加@NoRepeatSubmit注解,例如:
@RestController
public class UserController {@NoRepeatSubmit // 添加此注解表示该接口需要拦截重复提交请求@GetMapping("/submit")public String submit() {// 处理业务逻辑...return "success";}
}

通过以上步骤,我们实现了一个简单的后台拦截接口重复提交的功能。在实际项目中,还需要考虑更多的细节,例如如何保证锁的释放、如何处理并发请求等。但这个示例应该能帮助你入门SpringBoot拦截器的使用。

http://www.lryc.cn/news/157045.html

相关文章:

  • C语言 数据结构与算法 I
  • PHP指定时间戳/日期加一天,一年,一周,一月
  • 前端框架 vue-admin-template的搭建运行
  • Git—版本控制系统
  • 【MySQL基础|第一篇】——谈谈SQL中的DDL语句
  • 移动安全测试框架-MobSF WINDOWS 环境搭建
  • QT连接OpenCV库完成人脸识别
  • 使用 ElasticSearch 作为知识库,存储向量及相似性搜索
  • 视频图像处理算法opencv在esp32及esp32s3上面的移植,也可以移植openmv
  • 2. postgresql并行扫描(1)——pg强制走并行扫描建表及参数配置
  • 【C++】动态内存管理
  • MATLAB R2023a完美激活版(附激活补丁)
  • 垃圾回收 - 标记压缩算法
  • Vue中过滤器如何使用?
  • 【爬虫】7.4. 字体反爬案例分析与爬取实战
  • Linux cat 的作用
  • Windows中的命令行提示符里的Start命令执行路径包含空格时的问题
  • 【基础计算机网络1】认识计算机网络体系结构,了解计算机网络的大致模型(上)
  • 学校宿舍智能水电表管理系统:为节约资源保驾护航
  • EasyFalsh移植使用方法
  • 函数栈帧(详解)
  • 【面试题总结1】-Static、Const、QT中基于TCP的通信服务器/客户端端操作
  • 镜像的基本命令(docker)
  • Liunx远程调试
  • Mac m1 安装rabbitmq+php-amqplib
  • 如何实现软件的快速交付与部署?
  • c语言每日一练(14)【加强版】
  • 操作系统的知识点总结
  • 浏览器安全-同源策略和CORS
  • MySQL——条件查询