网站推广优化外链,发布文章后马上更新网站主页,wordpress 跳转小程序,企业网站建设的材料基于SpringBoot框架来开发业务后台项目时#xff0c;接口重复提交是一个常见的问题。为了避免这个问题#xff0c;我们可以通过自定义拦截器实现一个后台拦截接口重复提交的功能#xff0c;本文将介绍如何使用基于SpringBoot实现这个功能。
首先#xff0c;我们需要引入一…基于SpringBoot框架来开发业务后台项目时接口重复提交是一个常见的问题。为了避免这个问题我们可以通过自定义拦截器实现一个后台拦截接口重复提交的功能本文将介绍如何使用基于SpringBoot实现这个功能。
首先我们需要引入一个Aop依赖。在pom.xml文件中添加如下依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-aop/artifactId
/dependency创建一个自定义注解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;
}创建一个拦截器类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;}}}
}注册拦截器
实现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);}
}在需要进行拦截的接口上添加NoRepeatSubmit注解例如
RestController
public class UserController {NoRepeatSubmit // 添加此注解表示该接口需要拦截重复提交请求GetMapping(/submit)public String submit() {// 处理业务逻辑...return success;}
}通过以上步骤我们实现了一个简单的后台拦截接口重复提交的功能。在实际项目中还需要考虑更多的细节例如如何保证锁的释放、如何处理并发请求等。但这个示例应该能帮助你入门SpringBoot拦截器的使用。