From 06cadbe05590a10a5896bc8386bac29d8fda7f56 Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Wed, 12 Apr 2023 17:17:12 +0800 Subject: [PATCH] =?UTF-8?q?updateInstallBot=E6=8E=A5=E5=8F=A3=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E9=87=8D=E5=A4=8D=E8=AF=B7=E6=B1=82=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 ++ .../softbot/annotation/NoRepeatSubmit.java | 14 +++++ .../gitlink/softbot/annotation/UrlCache.java | 21 +++++++ .../annotation/aop/NoRepeatSubmitAop.java | 61 +++++++++++++++++++ .../controller/user/UserController.java | 3 + 5 files changed, 105 insertions(+) create mode 100644 src/main/java/com/gitlink/softbot/annotation/NoRepeatSubmit.java create mode 100644 src/main/java/com/gitlink/softbot/annotation/UrlCache.java create mode 100644 src/main/java/com/gitlink/softbot/annotation/aop/NoRepeatSubmitAop.java diff --git a/pom.xml b/pom.xml index b3670c9..cd49a34 100644 --- a/pom.xml +++ b/pom.xml @@ -149,6 +149,12 @@ aspectjweaver 1.9.4 + + + com.google.guava + guava + 20.0 + diff --git a/src/main/java/com/gitlink/softbot/annotation/NoRepeatSubmit.java b/src/main/java/com/gitlink/softbot/annotation/NoRepeatSubmit.java new file mode 100644 index 0000000..dd0aae2 --- /dev/null +++ b/src/main/java/com/gitlink/softbot/annotation/NoRepeatSubmit.java @@ -0,0 +1,14 @@ +package com.gitlink.softbot.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + +@Target(ElementType.METHOD) // 作用到方法上 +@Retention(RetentionPolicy.RUNTIME) // 运行时有效 +public @interface NoRepeatSubmit { + +} + diff --git a/src/main/java/com/gitlink/softbot/annotation/UrlCache.java b/src/main/java/com/gitlink/softbot/annotation/UrlCache.java new file mode 100644 index 0000000..bade18c --- /dev/null +++ b/src/main/java/com/gitlink/softbot/annotation/UrlCache.java @@ -0,0 +1,21 @@ +package com.gitlink.softbot.annotation; + +import java.util.concurrent.TimeUnit; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + +/** + * @Description: 内存缓存配置类 + */ + +@Configuration +public class UrlCache { + @Bean + public Cache getCache() { + return CacheBuilder.newBuilder().expireAfterWrite(2L, TimeUnit.SECONDS).build();// 缓存有效期为2秒 + } +} diff --git a/src/main/java/com/gitlink/softbot/annotation/aop/NoRepeatSubmitAop.java b/src/main/java/com/gitlink/softbot/annotation/aop/NoRepeatSubmitAop.java new file mode 100644 index 0000000..ddea47c --- /dev/null +++ b/src/main/java/com/gitlink/softbot/annotation/aop/NoRepeatSubmitAop.java @@ -0,0 +1,61 @@ +package com.gitlink.softbot.annotation.aop; + +import javax.servlet.http.HttpServletRequest; + +import com.gitlink.softbot.annotation.NoRepeatSubmit; +import com.gitlink.softbot.global.exception.BotException; +import com.gitlink.softbot.global.vo.Result; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +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 com.google.common.cache.Cache; + +/** + * @Description: aop解析注解-配合google的Cache缓存机制 + * @Author: Zoutao + * @Date: 2020/4/14 + */ +@Aspect +@Component +public class NoRepeatSubmitAop { + + private Log logger = LogFactory.getLog(getClass()); + + @Autowired + private Cache cache; + + @Pointcut("@annotation(noRepeatSubmit)") + public void pointCut(NoRepeatSubmit noRepeatSubmit) { + } + + @Around("pointCut(noRepeatSubmit)") + public Object around(ProceedingJoinPoint pjp, NoRepeatSubmit noRepeatSubmit) { + Result result = new Result<>(); + try { + ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + String sessionId = RequestContextHolder.getRequestAttributes().getSessionId(); + HttpServletRequest request = attributes.getRequest(); + String key = sessionId + "-" + request.getServletPath(); + if (cache.getIfPresent(key) == null) {// 如果缓存中有这个url视为重复提交 + Object o = pjp.proceed(); + cache.put(key, 0); + return o; + } else { + logger.error("重复请求,请稍后再试!"); + return result.build(500).build("重复请求,请稍后再试!"); + } + } catch (Throwable e) { + e.printStackTrace(); + logger.error("验证重复提交时出现未知异常!"); + return result.build(500).build("验证重复提交时出现未知异常!"); + } + } +} diff --git a/src/main/java/com/gitlink/softbot/controller/user/UserController.java b/src/main/java/com/gitlink/softbot/controller/user/UserController.java index f817a60..3d68b5a 100644 --- a/src/main/java/com/gitlink/softbot/controller/user/UserController.java +++ b/src/main/java/com/gitlink/softbot/controller/user/UserController.java @@ -1,6 +1,7 @@ package com.gitlink.softbot.controller.user; import com.fasterxml.jackson.core.JsonProcessingException; +import com.gitlink.softbot.annotation.NoRepeatSubmit; import com.gitlink.softbot.global.exception.BotException; import com.gitlink.softbot.global.vo.Response; import com.gitlink.softbot.global.vo.Result; @@ -9,6 +10,7 @@ import com.gitlink.softbot.utils.AuthOperate; import com.gitlink.softbot.utils.GitLinkApi; import com.gitlink.softbot.vo.*; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.*; import com.gitlink.softbot.vo.BotInputVO; import javax.annotation.Resource; @@ -181,6 +183,7 @@ public class UserController { * @return */ @PostMapping("/updateInstallBot") + @NoRepeatSubmit public Result updateInstallBot(@Valid @RequestBody UpdateInstallBotRequest updateInstallBotRequest) throws Exception{ Result result = new Result<>(); userService.updateInstallBot(updateInstallBotRequest);