From 36afb6ca6e6c5a0165ae2ff9ee6339282ea9f3bd Mon Sep 17 00:00:00 2001 From: sxu <602087911@qq.com> Date: Mon, 19 Aug 2024 09:19:53 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../annotation/PreventRepeatSubmit.java | 2 +- .../aspect/PreventRepeatSubmitAspect.java | 11 +- .../common/security/utils}/RedisCache.java | 2 +- .../aspect/PreventRepeatSubmitAspect.java | 70 ----- .../material/controller/ToDoController.java | 4 +- .../annotation/PreventRepeatSubmit.java | 24 -- .../controller/SysProfileController.java | 2 - .../bonus/sgzb/system/util/RedisCache.java | 268 ------------------ 8 files changed, 10 insertions(+), 373 deletions(-) rename {sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/common => sgzb-common/sgzb-common-security/src/main/java/com/bonus/sgzb/common/security}/annotation/PreventRepeatSubmit.java (90%) rename {sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system => sgzb-common/sgzb-common-security/src/main/java/com/bonus/sgzb/common/security}/aspect/PreventRepeatSubmitAspect.java (91%) rename {sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/common/util => sgzb-common/sgzb-common-security/src/main/java/com/bonus/sgzb/common/security/utils}/RedisCache.java (99%) delete mode 100644 sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/common/aspect/PreventRepeatSubmitAspect.java delete mode 100644 sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/annotation/PreventRepeatSubmit.java delete mode 100644 sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/util/RedisCache.java diff --git a/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/common/annotation/PreventRepeatSubmit.java b/sgzb-common/sgzb-common-security/src/main/java/com/bonus/sgzb/common/security/annotation/PreventRepeatSubmit.java similarity index 90% rename from sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/common/annotation/PreventRepeatSubmit.java rename to sgzb-common/sgzb-common-security/src/main/java/com/bonus/sgzb/common/security/annotation/PreventRepeatSubmit.java index b978b2d..943e220 100644 --- a/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/common/annotation/PreventRepeatSubmit.java +++ b/sgzb-common/sgzb-common-security/src/main/java/com/bonus/sgzb/common/security/annotation/PreventRepeatSubmit.java @@ -1,4 +1,4 @@ -package com.bonus.sgzb.common.annotation; +package com.bonus.sgzb.common.security.annotation; import java.lang.annotation.*; diff --git a/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/aspect/PreventRepeatSubmitAspect.java b/sgzb-common/sgzb-common-security/src/main/java/com/bonus/sgzb/common/security/aspect/PreventRepeatSubmitAspect.java similarity index 91% rename from sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/aspect/PreventRepeatSubmitAspect.java rename to sgzb-common/sgzb-common-security/src/main/java/com/bonus/sgzb/common/security/aspect/PreventRepeatSubmitAspect.java index 40aa21a..0ae33a1 100644 --- a/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/aspect/PreventRepeatSubmitAspect.java +++ b/sgzb-common/sgzb-common-security/src/main/java/com/bonus/sgzb/common/security/aspect/PreventRepeatSubmitAspect.java @@ -1,10 +1,10 @@ -package com.bonus.sgzb.system.aspect; +package com.bonus.sgzb.common.security.aspect; import com.alibaba.fastjson2.JSON; -import com.bonus.sgzb.common.core.utils.HttpCodeEnum; -import com.bonus.sgzb.system.annotation.PreventRepeatSubmit; import com.bonus.sgzb.common.core.exception.BusinessException; -import com.bonus.sgzb.system.util.RedisCache; +import com.bonus.sgzb.common.core.utils.HttpCodeEnum; +import com.bonus.sgzb.common.security.annotation.PreventRepeatSubmit; +import com.bonus.sgzb.common.security.utils.RedisCache; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; @@ -16,6 +16,7 @@ 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.servlet.http.HttpServletRequest; import java.lang.reflect.Method; import java.util.concurrent.TimeUnit; @@ -30,7 +31,7 @@ public class PreventRepeatSubmitAspect { private RedisCache redisCache; // 定义一个切入点 - @Pointcut("@annotation(com.bonus.sgzb.system.annotation.PreventRepeatSubmit)") + @Pointcut("@annotation(com.bonus.sgzb.common.security.annotation.PreventRepeatSubmit)") public void preventRepeatSubmit() { } diff --git a/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/common/util/RedisCache.java b/sgzb-common/sgzb-common-security/src/main/java/com/bonus/sgzb/common/security/utils/RedisCache.java similarity index 99% rename from sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/common/util/RedisCache.java rename to sgzb-common/sgzb-common-security/src/main/java/com/bonus/sgzb/common/security/utils/RedisCache.java index 178e343..6826c62 100644 --- a/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/common/util/RedisCache.java +++ b/sgzb-common/sgzb-common-security/src/main/java/com/bonus/sgzb/common/security/utils/RedisCache.java @@ -1,4 +1,4 @@ -package com.bonus.sgzb.common.util; +package com.bonus.sgzb.common.security.utils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.BoundSetOperations; diff --git a/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/common/aspect/PreventRepeatSubmitAspect.java b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/common/aspect/PreventRepeatSubmitAspect.java deleted file mode 100644 index 20e83c1..0000000 --- a/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/common/aspect/PreventRepeatSubmitAspect.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.bonus.sgzb.common.aspect; - -import com.alibaba.fastjson2.JSON; -import com.bonus.sgzb.common.annotation.PreventRepeatSubmit; -import com.bonus.sgzb.common.core.exception.BusinessException; -import com.bonus.sgzb.common.core.utils.HttpCodeEnum; -import com.bonus.sgzb.common.util.RedisCache; -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.aspectj.lang.reflect.MethodSignature; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -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.servlet.http.HttpServletRequest; -import java.lang.reflect.Method; -import java.util.concurrent.TimeUnit; - -@Aspect -@Component -public class PreventRepeatSubmitAspect { - private static final Logger LOG = LoggerFactory.getLogger(PreventRepeatSubmitAspect.class); - private static final String header = "Authorization"; - - @Autowired - private RedisCache redisCache; - - // 定义一个切入点 - @Pointcut("@annotation(com.bonus.sgzb.common.annotation.PreventRepeatSubmit)") - public void preventRepeatSubmit() { - - } - - @Around("preventRepeatSubmit()") - public Object checkPrs(ProceedingJoinPoint pjp) throws Throwable { - LOG.info("进入preventRepeatSubmit切面"); - //得到request对象 - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String requestURI = request.getRequestURI(); - LOG.info("防重复提交的请求地址:{} ,请求方式:{}",requestURI,request.getMethod()); - LOG.info("防重复提交拦截到的类名:{} ,方法:{}",pjp.getTarget().getClass().getSimpleName(),pjp.getSignature().getName()); - - //获取请求参数 - Object[] args = pjp.getArgs(); - String argStr = JSON.toJSONString(args); - //这里替换是为了在redis可视化工具中方便查看 - argStr=argStr.replace(":","#"); - // 唯一值(没有消息头则使用请求地址) - String submitKey = request.getHeader(header).trim(); - // 唯一标识(指定key + url +参数+token) - String cacheRepeatKey = "repeat_submit:" + requestURI+":" +argStr+":"+ submitKey; - MethodSignature ms = (MethodSignature) pjp.getSignature(); - Method method=ms.getMethod(); - PreventRepeatSubmit preventRepeatSubmit=method.getAnnotation(PreventRepeatSubmit.class); - int interval = preventRepeatSubmit.interval(); - LOG.info("获取到preventRepeatSubmit的有效期时间"+interval); - //redis分布式锁 - Boolean aBoolean = redisCache.setNxCacheObject(cacheRepeatKey, 1, preventRepeatSubmit.interval(), TimeUnit.SECONDS); - //aBoolean为true则证明没有重复提交 - if(!aBoolean){ - throw new BusinessException(HttpCodeEnum.REPEATE_ERROR); - } - return pjp.proceed(); - } - -} diff --git a/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/material/controller/ToDoController.java b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/material/controller/ToDoController.java index 5db6e6d..fb2b8f6 100644 --- a/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/material/controller/ToDoController.java +++ b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/material/controller/ToDoController.java @@ -3,7 +3,7 @@ package com.bonus.sgzb.material.controller; import com.bonus.sgzb.common.core.web.controller.BaseController; import com.bonus.sgzb.common.core.web.domain.AjaxResult; import com.bonus.sgzb.common.core.web.page.TableDataInfo; -import com.bonus.sgzb.common.annotation.PreventRepeatSubmit; +import com.bonus.sgzb.common.security.annotation.PreventRepeatSubmit; import com.bonus.sgzb.material.domain.ToDoBean; import com.bonus.sgzb.material.service.ToDoService; import com.bonus.sgzb.material.vo.NoticeInfoVO; @@ -30,6 +30,7 @@ public class ToDoController extends BaseController { * 代办事项列表 */ @ApiOperation(value = "代办事项列表") + @PreventRepeatSubmit @GetMapping("/getToDoList") public TableDataInfo getToDoList(ToDoBean bean) { @@ -39,7 +40,6 @@ public class ToDoController extends BaseController { } @ApiOperation(value = "代办事件下拉") - @PreventRepeatSubmit @PostMapping("/getTaskType") public AjaxResult getTaskType(ToDoBean bean){ return toDoService.getTaskType(bean); diff --git a/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/annotation/PreventRepeatSubmit.java b/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/annotation/PreventRepeatSubmit.java deleted file mode 100644 index b2a031d..0000000 --- a/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/annotation/PreventRepeatSubmit.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.bonus.sgzb.system.annotation; - -import java.lang.annotation.*; - -/** - * 自定义注解防止表单重复提交 - * - */ -@Inherited -@Target({ElementType.METHOD, ElementType.TYPE}) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface PreventRepeatSubmit -{ - /** - * 间隔时间(s),小于此时间视为重复提交 - */ - public int interval() default 3; - - /** - * 提示消息 - */ - public String message() default "不允许重复提交,请稍候再试"; -} diff --git a/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/controller/SysProfileController.java b/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/controller/SysProfileController.java index 90e3f5f..d98f596 100644 --- a/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/controller/SysProfileController.java +++ b/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/controller/SysProfileController.java @@ -8,7 +8,6 @@ import cn.hutool.core.util.IdUtil; import com.bonus.sgzb.common.core.constant.Constants; import com.bonus.sgzb.common.core.domain.R; import com.bonus.sgzb.common.core.utils.DateTimeHelper; -import com.bonus.sgzb.system.annotation.PreventRepeatSubmit; import com.bonus.sgzb.system.api.domain.SysFile; import com.bonus.sgzb.system.config.RsaUtil; import com.bonus.sgzb.system.domain.FileInfo; @@ -59,7 +58,6 @@ public class SysProfileController extends BaseController { /** * 个人信息 */ - @PreventRepeatSubmit @GetMapping public AjaxResult profile() { String username = SecurityUtils.getLoginUser().getUsername(); diff --git a/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/util/RedisCache.java b/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/util/RedisCache.java deleted file mode 100644 index 9a144ca..0000000 --- a/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/util/RedisCache.java +++ /dev/null @@ -1,268 +0,0 @@ -package com.bonus.sgzb.system.util; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.BoundSetOperations; -import org.springframework.data.redis.core.HashOperations; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.ValueOperations; -import org.springframework.stereotype.Component; -import java.util.*; -import java.util.concurrent.TimeUnit; - -/** - * spring redis 工具类 - * - **/ -@Component -public class RedisCache -{ - @Autowired - public RedisTemplate redisTemplate; - - //添加分布式锁 - public Boolean setNxCacheObject(final String key, final T value,long lt,TimeUnit tu) - { - return redisTemplate.opsForValue().setIfAbsent(key,value,lt,tu); - } - - /** - * 缓存基本的对象,Integer、String、实体类等 - * - * @param key 缓存的键值 - * @param value 缓存的值 - */ - public void setCacheObject(final String key, final T value) - { - redisTemplate.opsForValue().set(key, value); - } - - /** - * 缓存基本的对象,Integer、String、实体类等 - * - * @param key 缓存的键值 - * @param value 缓存的值 - * @param timeout 时间 - * @param timeUnit 时间颗粒度 - */ - public void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) - { - redisTemplate.opsForValue().set(key, value, timeout, timeUnit); - } - - /** - * 设置有效时间 - * - * @param key Redis键 - * @param timeout 超时时间 - * @return true=设置成功;false=设置失败 - */ - public boolean expire(final String key, final long timeout) - { - return expire(key, timeout, TimeUnit.SECONDS); - } - - /** - * 设置有效时间 - * - * @param key Redis键 - * @param timeout 超时时间 - * @param unit 时间单位 - * @return true=设置成功;false=设置失败 - */ - public boolean expire(final String key, final long timeout, final TimeUnit unit) - { - return redisTemplate.expire(key, timeout, unit); - } - - /** - * 获取有效时间 - * - * @param key Redis键 - * @return 有效时间 - */ - public long getExpire(final String key) - { - return redisTemplate.getExpire(key); - } - - /** - * 判断 key是否存在 - * - * @param key 键 - * @return true 存在 false不存在 - */ - public Boolean hasKey(String key) - { - return redisTemplate.hasKey(key); - } - - /** - * 获得缓存的基本对象。 - * - * @param key 缓存键值 - * @return 缓存键值对应的数据 - */ - public T getCacheObject(final String key) - { - ValueOperations operation = redisTemplate.opsForValue(); - return operation.get(key); - } - - /** - * 删除单个对象 - * - * @param key - */ - public boolean deleteObject(final String key) - { - return redisTemplate.delete(key); - } - - /** - * 删除集合对象 - * - * @param collection 多个对象 - * @return - */ - public boolean deleteObject(final Collection collection) - { - return redisTemplate.delete(collection) > 0; - } - - /** - * 缓存List数据 - * - * @param key 缓存的键值 - * @param dataList 待缓存的List数据 - * @return 缓存的对象 - */ - public long setCacheList(final String key, final List dataList) - { - Long count = redisTemplate.opsForList().rightPushAll(key, dataList); - return count == null ? 0 : count; - } - - /** - * 获得缓存的list对象 - * - * @param key 缓存的键值 - * @return 缓存键值对应的数据 - */ - public List getCacheList(final String key) - { - return redisTemplate.opsForList().range(key, 0, -1); - } - - /** - * 缓存Set - * - * @param key 缓存键值 - * @param dataSet 缓存的数据 - * @return 缓存数据的对象 - */ - public BoundSetOperations setCacheSet(final String key, final Set dataSet) - { - BoundSetOperations setOperation = redisTemplate.boundSetOps(key); - Iterator it = dataSet.iterator(); - while (it.hasNext()) - { - setOperation.add(it.next()); - } - return setOperation; - } - - /** - * 获得缓存的set - * - * @param key - * @return - */ - public Set getCacheSet(final String key) - { - return redisTemplate.opsForSet().members(key); - } - - /** - * 缓存Map - * - * @param key - * @param dataMap - */ - public void setCacheMap(final String key, final Map dataMap) - { - if (dataMap != null) { - redisTemplate.opsForHash().putAll(key, dataMap); - } - } - - /** - * 获得缓存的Map - * - * @param key - * @return - */ - public Map getCacheMap(final String key) - { - return redisTemplate.opsForHash().entries(key); - } - - /** - * 往Hash中存入数据 - * - * @param key Redis键 - * @param hKey Hash键 - * @param value 值 - */ - public void setCacheMapValue(final String key, final String hKey, final T value) - { - redisTemplate.opsForHash().put(key, hKey, value); - } - - /** - * 获取Hash中的数据 - * - * @param key Redis键 - * @param hKey Hash键 - * @return Hash中的对象 - */ - public T getCacheMapValue(final String key, final String hKey) - { - HashOperations opsForHash = redisTemplate.opsForHash(); - return opsForHash.get(key, hKey); - } - - /** - * 获取多个Hash中的数据 - * - * @param key Redis键 - * @param hKeys Hash键集合 - * @return Hash对象集合 - */ - public List getMultiCacheMapValue(final String key, final Collection hKeys) - { - return redisTemplate.opsForHash().multiGet(key, hKeys); - } - - /** - * 删除Hash中的某条数据 - * - * @param key Redis键 - * @param hKey Hash键 - * @return 是否成功 - */ - public boolean deleteCacheMapValue(final String key, final String hKey) - { - return redisTemplate.opsForHash().delete(key, hKey) > 0; - } - - /** - * 获得缓存的基本对象列表 - * - * @param pattern 字符串前缀 - * @return 对象列表 - */ - public Collection keys(final String pattern) - { - return redisTemplate.keys(pattern); - } -}