RepeatSubmitAspect.java 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package com.kmall.admin.aop;
  2. import com.kmall.admin.annotation.NoRepeatSubmit;
  3. import com.kmall.common.utils.RRException;
  4. import com.kmall.manager.manager.redis.JedisUtil;
  5. import org.aspectj.lang.ProceedingJoinPoint;
  6. import org.aspectj.lang.annotation.Around;
  7. import org.aspectj.lang.annotation.Aspect;
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10. import org.springframework.stereotype.Component;
  11. import org.springframework.web.context.request.RequestContextHolder;
  12. import org.springframework.web.context.request.ServletRequestAttributes;
  13. import javax.servlet.http.HttpServletRequest;
  14. import java.util.Objects;
  15. /**
  16. * @author hj
  17. * @createDate 2021-04-29
  18. */
  19. @Aspect
  20. @Component
  21. @SuppressWarnings("all")
  22. public class RepeatSubmitAspect {
  23. private final static Logger logger = LoggerFactory.getLogger(RepeatSubmitAspect.class);
  24. public static final String KEYPREX = "noRpeat:user:";
  25. /**
  26. * 进行接口防重复操作处理
  27. *
  28. * @param pjp
  29. * @param noRepeatSubmit
  30. * @return
  31. */
  32. @Around("execution(* com.kmall.admin.controller.*.*(..)) && @annotation(noRepeatSubmit) ")
  33. public Object around(ProceedingJoinPoint pjp, NoRepeatSubmit noRepeatSubmit) throws Throwable {
  34. try {
  35. //获取request
  36. HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
  37. //拿到token和请求路径
  38. StringBuilder sb = new StringBuilder();
  39. // sb.append(KEYPREX).append(request.getHeader("token").toString()).append(request.getRequestURI().toString());
  40. sb.append(KEYPREX).append(request.getRequestURI().toString());
  41. //获取现在时间
  42. long now = System.currentTimeMillis();
  43. if (JedisUtil.exists(sb.toString())) {
  44. //上次请求时间
  45. // long lastTime = Long.valueOf(redisTemplate.opsForValue().get(sb.toString()).toString());
  46. long lastTime = Long.valueOf(JedisUtil.get(sb.toString()).toString());
  47. // 如果现在距离上次提交时间小于设置的默认时间 则 判断为重复提交 否则 正常提交 -> 进入业务处理
  48. if ((now - lastTime) > noRepeatSubmit.lockTime()) {
  49. //重新记录时间 10分钟过期时间
  50. // redisTemplate.opsForValue().set(sb.toString(), String.valueOf(now), 10, TimeUnit.MINUTES);
  51. JedisUtil.set(sb.toString(), String.valueOf(now), 10);
  52. //处理业务
  53. Object result = pjp.proceed();
  54. return result;
  55. } else {
  56. throw new RRException("点击的太快了,请慢一点!");
  57. }
  58. } else {
  59. //第一次操作
  60. JedisUtil.set(sb.toString(), String.valueOf(now), 10);
  61. // redisTemplate.opsForValue().set(sb.toString(),String.valueOf(now),10, TimeUnit.MINUTES);
  62. Object result = pjp.proceed();
  63. return result;
  64. }
  65. } catch (Throwable e) {
  66. logger.error("校验表单重复提交时异常: {}", e.getMessage());
  67. throw new RRException("校验重复提交时异常");
  68. }
  69. }
  70. }