经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring » 查看文章
springboot 防止重复请求防止重复点击的操作
来源:jb51  时间:2023/2/1 9:35:47  对本文有异议

  利用 springboot + redis 实现过滤重复提交的请求,业务流程如下所示,首先定义一个拦截器,拦截需要进行过滤的URL,然后用 session + URL 作为唯一 key,利用 redis setnx 命令,来判断请求是否重复,如果 key set 成功,说明非重复请求,失败则说明重复请求;

在这里插入图片描述

  URL 拦截器可以使用 spring 拦截器,但使用 spring,每个需要过滤的新 URL 都需要添加配置,因此这里使用 AOP 注解 的形式来实现,这样更直观一点;
  首先,定义注解:

  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target({ElementType.METHOD, ElementType.TYPE})
  3. public @interface AvoidRepeatRequest {
  4. /** 请求间隔时间,单位秒,该时间范围内的请求为重复请求 */
  5. int intervalTime() default 5;
  6. /** 返回的提示信息 */
  7. String msg() default "请不要频繁重复请求!";
  8. }

  然后定义 AOP,实现重复请求过滤功能:

  1. @Component
  2. @Aspect
  3. @Order(100)
  4. public class FilterRepeatRequest {
  5. private static final String SUFFIX = "REQUEST_";
  6. @Autowired
  7. private RedisTemplate redisTemplate;
  8.  
  9. // 定义 注解 类型的切点
  10. @Pointcut("@annotation(com.common.ann.AvoidRepeatRequest)")
  11. public void arrPointcut() {}
  12.  
  13. // 实现过滤重复请求功能
  14. @Around("arrPointcut()")
  15. public Object arrBusiness(ProceedingJoinPoint joinPoint) {
  16. // 获取 redis key,由 session ID 和 请求URI 构成
  17. ServletRequestAttributes sra = (ServletRequestAttributes)
  18. RequestContextHolder.currentRequestAttributes();
  19. HttpServletRequest request = sra.getRequest();
  20. String key = SUFFIX + request.getSession().getId() + "_" + request.getRequestURI();
  21.  
  22. // 获取方法的 AvoidRepeatRequest 注解
  23. Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
  24. AvoidRepeatRequest arr = method.getAnnotation(AvoidRepeatRequest.class);
  25.  
  26. // 判断是否是重复的请求
  27. if (!redisTemplate.opsForValue().setIfAbsent(key, 1, arr.intervalTime(), TimeUnit.SECONDS)) {
  28. // 已发起过请求
  29. System.out.println("重复请求");
  30. return arr.msg();
  31. }
  32.  
  33. try {
  34. // 非重复请求,执行业务代码
  35. return joinPoint.proceed();
  36. } catch (Throwable throwable) {
  37. throwable.printStackTrace();
  38. return "error";
  39. }
  40. }
  41. }
  42.  

  测试使用:

  1. @RestController
  2. public class TestAop {
  3.  
  4. // 使用 AvoidRepeatRequest 注解的请求,表明需要进行重复请求判断
  5. @AvoidRepeatRequest(intervalTime = 6, msg = "慢点,兄弟")
  6. @GetMapping("test/aop")
  7. public String test() {
  8. return "test aop";
  9. }
  10. }

到此这篇关于springboot 防止重复请求防止重复点击的操作的文章就介绍到这了,更多相关springboot 重复请求内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号