1
0

RepeatSubmitAspect.java 3.3 KB

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