From 655ffe8d3b9b07213167386b450e69ebd4b0beb6 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Thu, 09 Jul 2020 09:51:02 +0800
Subject: [PATCH] add submit repeat limit
---
src/main/resources/i18n/messages_zh_CN.properties | 2 +
src/main/java/com/xcong/excoin/common/annotations/SubmitRepeat.java | 13 ++++++
src/main/java/com/xcong/excoin/common/aop/SubmitRepeatAspect.java | 74 +++++++++++++++++++++++++++++++++++++
src/main/resources/i18n/messages_en_US.properties | 2 +
pom.xml | 5 ++
src/main/java/com/xcong/excoin/common/system/controller/LoginController.java | 2 +
6 files changed, 98 insertions(+), 0 deletions(-)
diff --git a/pom.xml b/pom.xml
index cae38c0..0438973 100644
--- a/pom.xml
+++ b/pom.xml
@@ -59,6 +59,11 @@
<dependency>
<groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-aop</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
diff --git a/src/main/java/com/xcong/excoin/common/annotations/SubmitRepeat.java b/src/main/java/com/xcong/excoin/common/annotations/SubmitRepeat.java
new file mode 100644
index 0000000..eb41b12
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/common/annotations/SubmitRepeat.java
@@ -0,0 +1,13 @@
+package com.xcong.excoin.common.annotations;
+
+import java.lang.annotation.*;
+
+/**
+ *
+ * @author helius
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface SubmitRepeat {
+}
diff --git a/src/main/java/com/xcong/excoin/common/aop/SubmitRepeatAspect.java b/src/main/java/com/xcong/excoin/common/aop/SubmitRepeatAspect.java
new file mode 100644
index 0000000..9d00c82
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/common/aop/SubmitRepeatAspect.java
@@ -0,0 +1,74 @@
+package com.xcong.excoin.common.aop;
+
+import com.xcong.excoin.common.annotations.SubmitRepeat;
+import com.xcong.excoin.common.response.Result;
+import com.xcong.excoin.utils.MessageSourceUtils;
+import com.xcong.excoin.utils.RedisUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @author wzy
+ * @date 2020-04-16 22:01
+ **/
+@Slf4j
+@Aspect
+@Component
+public class SubmitRepeatAspect {
+
+ @Resource
+ private RedisUtils redisUtil;
+
+ private String key;
+
+ @Pointcut("@annotation(submitRepeat)")
+ public void submitRepeatPointCut(SubmitRepeat submitRepeat) {
+
+ }
+
+ @Before("submitRepeatPointCut(submitRepeat)")
+ public void before(SubmitRepeat submitRepeat) {
+ }
+
+ @Around("submitRepeatPointCut(submitRepeat)")
+ public Object around(ProceedingJoinPoint joinPoint, SubmitRepeat submitRepeat) throws Throwable {
+ ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+ HttpServletRequest request = attributes.getRequest();
+
+ String token = request.getHeader("token");
+ String uri = request.getRequestURI();
+ String mId = (String) redisUtil.get(token);
+ log.info("#token : {}, uri : {}, mId : {}#", token, uri, mId);
+ key = mId + "_" + uri;
+ boolean flag = redisUtil.setNotExist(key, "1", 5);
+ log.info("#mid : {}, flag : {}#", mId, flag);
+ if (flag) {
+ Object result = joinPoint.proceed();
+ redisUtil.del(key);
+ return result;
+ } else {
+ return Result.fail(MessageSourceUtils.getString("submit_repeat"));
+ }
+ }
+
+ @After("submitRepeatPointCut(submitRepeat)")
+ public void after(SubmitRepeat submitRepeat) {
+
+ }
+
+ @AfterThrowing(throwing = "ex", pointcut = "submitRepeatPointCut(submitRepeat)")
+ public void afterThrows(JoinPoint jp, Exception ex, SubmitRepeat submitRepeat) throws Exception {
+ log.error("#submit repeat error:#", ex);
+ redisUtil.del(key);
+ throw new Exception("系统繁忙");
+ }
+}
diff --git a/src/main/java/com/xcong/excoin/common/system/controller/LoginController.java b/src/main/java/com/xcong/excoin/common/system/controller/LoginController.java
index d8bfd99..4754bb5 100644
--- a/src/main/java/com/xcong/excoin/common/system/controller/LoginController.java
+++ b/src/main/java/com/xcong/excoin/common/system/controller/LoginController.java
@@ -10,6 +10,7 @@
import cn.hutool.crypto.asymmetric.SignAlgorithm;
import com.alibaba.fastjson.JSONObject;
import com.xcong.excoin.common.LoginUserUtils;
+import com.xcong.excoin.common.annotations.SubmitRepeat;
import com.xcong.excoin.common.contants.AppContants;
import com.xcong.excoin.common.response.Result;
import com.xcong.excoin.common.system.bean.LoginUserBean;
@@ -110,6 +111,7 @@
return rsa.encryptBase64(token + "_" + System.currentTimeMillis(), KeyType.PublicKey);
}
+ @SubmitRepeat
@ApiOperation(value = "app注册接口", notes = "app注册接口,验证码必须输入可默认为123456")
@PostMapping(value = "/register")
public Result register(@RequestBody @Validated RegisterDto registerDto) {
diff --git a/src/main/resources/i18n/messages_en_US.properties b/src/main/resources/i18n/messages_en_US.properties
index 47d0eaf..fc356e7 100644
--- a/src/main/resources/i18n/messages_en_US.properties
+++ b/src/main/resources/i18n/messages_en_US.properties
@@ -239,3 +239,5 @@
cancellation_success=Cancellation Success
cancellation_fail=Cancellation Fail
+submit_repeat=Do not repeat submission
+
diff --git a/src/main/resources/i18n/messages_zh_CN.properties b/src/main/resources/i18n/messages_zh_CN.properties
index 7cabde0..0fdc300 100644
--- a/src/main/resources/i18n/messages_zh_CN.properties
+++ b/src/main/resources/i18n/messages_zh_CN.properties
@@ -238,3 +238,5 @@
entrust_order_not_exist=委托单不存在
cancellation_success=撤销成功
cancellation_fail=撤销失败
+
+submit_repeat=请勿重复提交
--
Gitblit v1.9.1