当前位置:   article > 正文

注解防止重复提交(拦截器)

注解防止重复提交(拦截器)

一、前言

        上次使用了Spring Aop + 自定义注解实现了Redis防止重复提交的操作,这次换一种方式,防止重复提交的逻辑是相同的,还是采用 用户token + 接口url 进行唯一表示注解实现防止重复提交(Aop)_crazyK.的博客-CSDN博客

二、实现

创建注解 

首先创建一个防止重复提交的注解

  1. @Documented
  2. @Target({ElementType.TYPE,ElementType.METHOD})
  3. @Retention(RetentionPolicy.RUNTIME)
  4. public @interface NoRepeatSubmit2 {
  5. int lockTime() default 5;
  6. }

注解参数不懂的小伙伴可以移步这篇文章:java自定义注解_crazyK.的博客-CSDN博客 

创建拦截器

这里主要是继承 HandlerInterceptorAdapter 重写它的 preHandle 方法,通过反射在方法和类上寻找注解,然后进行防止重复提交的逻辑

  1. @Component
  2. public class SubmitInterceptor extends HandlerInterceptorAdapter {
  3. @Autowired
  4. private RedisTemplate<String,Object> redisTemplate;
  5. @Override
  6. public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
  7. Object handler)throws Exception{
  8. HandlerMethod handlerMethod = (HandlerMethod) handler;
  9. //通过反射在方法上寻找注解
  10. NoRepeatSubmit2 permission = handlerMethod.getMethodAnnotation(NoRepeatSubmit2.class);
  11. if (permission == null){
  12. //方法不存在则在类上寻找注解
  13. permission = handlerMethod.getBeanType().getAnnotation(NoRepeatSubmit2.class);
  14. }
  15. if (permission == null){
  16. //没有注解直接跳过拦截
  17. return true;
  18. }
  19. int time = permission.lockTime();
  20. HttpServletRequest httpServletRequest = HttpContextUtils.httpServletRequest();
  21. String token = request.getHeader("token");
  22. String url = request.getRequestURL().toString();
  23. String sign = url+"/"+token;
  24. Boolean key=redisTemplate.hasKey(sign);
  25. if (key){
  26. throw new Exception("请勿重复提交");
  27. }
  28. redisTemplate.opsForValue().set(sign,sign,time, TimeUnit.SECONDS);
  29. return true;
  30. }
  31. }

注册拦截器

  1. @Configuration
  2. public class WebMvcConfig implements WebMvcConfigurer {
  3. @Autowired
  4. private SubmitInterceptor submitInterceptor;
  5. @Override
  6. public void addInterceptors(InterceptorRegistry registry){
  7. registry.addInterceptor(submitInterceptor).addPathPatterns("/**");
  8. }
  9. }

最后在方法上加上此注解

三、测试

首先向 redis 中插入 一条 key为crazyk,value为csdn的数据

redis中也写入了

然后再提交一次

进入后端查看,系统抛出我们自己定义的异常

代码已同步至Gitee:RedisBoot: springboot集成redis

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/550765
推荐阅读
相关标签
  

闽ICP备14008679号