当前位置:   article > 正文

spring boot 防止表单重复提交(幂等性)_@repeatsubmit不生效

@repeatsubmit不生效

参考文章:https://www.jianshu.com/p/09c6b05b670a

小程序上传图片接口,经常出现短时间提交多条记录的问题,程序需要多线程处理3秒

同一客户端在3秒内对同一URL的提交视为表单重复提交

思路:根据登陆token  设置no-repeat redis缓存 过期时间为3秒  3秒内提交不生效

  1. package com.common;
  2. import java.lang.annotation.ElementType;
  3. import java.lang.annotation.Retention;
  4. import java.lang.annotation.RetentionPolicy;
  5. import java.lang.annotation.Target;
  6. @Target(ElementType.METHOD) // 作用到方法上
  7. @Retention(RetentionPolicy.RUNTIME) // 运行时有效
  8. /**
  9. * @功能描述 防止重复提交标记注解
  10. * @author www.gaozz.club
  11. * @date 2018-08-26
  12. */
  13. public @interface NoRepeatSubmit {
  14. }

pom.xml   Application.java 非重点忽略

自定义注解NoRepeatSubmit.java

 

aop解析注解NoRepeatSubmitAop.java

  1. @Slf4j
  2. @Aspect
  3. @Component
  4. /**
  5. * @功能描述 aop解析注解
  6. * @author zhq
  7. * @date 2020-07-02
  8. */
  9. public class NoRepeatSubmitAop {
  10. private final static Logger logger = LoggerFactory.getLogger(NoRepeatSubmitAop.class);
  11. @Autowired
  12. private RedisTemplate redisTemplate;
  13. @Autowired
  14. private JwtTokenUtil jwtTokenUtil;
  15. @Value("${jwt.noRepeat}")
  16. private String noRepeat;
  17. @Around("execution(* com.xxx..*Controller.*(..)) && @annotation(nrs)")
  18. public Object arround(ProceedingJoinPoint pjp, NoRepeatSubmit nrs) {
  19. try {
  20. //ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  21. HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  22. String token = noRepeat+jwtTokenUtil.getToken(request);
  23. if (redisTemplate.opsForValue().get(token) == null) {// 如果缓存中有这个url视为重复提交
  24. redisTemplate.opsForValue().set(token, 0, 3, TimeUnit.SECONDS);
  25. Object o = pjp.proceed();
  26. return o;
  27. } else {
  28. logger.error("重复提交");
  29. System.out.println("重复提交");
  30. return null;
  31. }
  32. } catch (Throwable e) {
  33. e.printStackTrace();
  34. logger.error("验证重复提交时出现未知异常!");
  35. return new ReturnVo(ReturnCodeMsg.fail,"验证重复提交时出现未知异常!",null);
  36. //return "{\"code\":-889,\"message\":\"验证重复提交时出现未知异常!\"}";
  37. }
  38. }
  39. }

 application.yml

jwt:

   # 防止重复key noRepeat: no-repeat/

注意: execution的路径不要出错  execution(* com.ylzzkzx..*Controller.*(..)

..表示多个文件夹目录  之前写错为.  导致没生效  还需要运行debugger下  看日志输出

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

闽ICP备14008679号