diff --git a/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/exception/BusinessException.java b/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/exception/BusinessException.java new file mode 100644 index 0000000..e7fe1e9 --- /dev/null +++ b/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/exception/BusinessException.java @@ -0,0 +1,28 @@ +package com.bonus.sgzb.common.core.exception; + +import com.bonus.sgzb.common.core.utils.HttpCodeEnum; + +public class BusinessException extends RuntimeException { + + private int code; + //使用枚举构造 + public BusinessException(HttpCodeEnum httpCodeEnum){ + super(httpCodeEnum.getMsg()); + this.code=httpCodeEnum.getCode(); + } + //使用自定义消息体 + public BusinessException(HttpCodeEnum httpCodeEnum, String msg){ + super(msg); + this.code=httpCodeEnum.getCode(); + } + + //根据异常构造 + public BusinessException(HttpCodeEnum httpCodeEnum, Throwable msg){ + super(msg); + this.code=httpCodeEnum.getCode(); + } + + + + +} diff --git a/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/exception/ServiceException.java b/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/exception/ServiceException.java index a6233f8..bc87543 100644 --- a/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/exception/ServiceException.java +++ b/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/exception/ServiceException.java @@ -1,7 +1,5 @@ package com.bonus.sgzb.common.core.exception; -import com.bonus.sgzb.common.core.enums.HttpCodeEnum; - /** * 业务异常 * @@ -24,6 +22,7 @@ public final class ServiceException extends RuntimeException /** * 错误明细,内部调试错误 * + * 和 {@link CommonResult#getDetailMessage()} 一致的设计 */ private String detailMessage; @@ -34,11 +33,6 @@ public final class ServiceException extends RuntimeException { } - public ServiceException(HttpCodeEnum httpCodeEnum){ - super(httpCodeEnum.getMsg()); - this.code=httpCodeEnum.getCode(); - } - public ServiceException(String message) { this.message = message; diff --git a/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/enums/HttpCodeEnum.java b/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/utils/HttpCodeEnum.java similarity index 90% rename from sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/enums/HttpCodeEnum.java rename to sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/utils/HttpCodeEnum.java index 846534f..3a80e58 100644 --- a/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/enums/HttpCodeEnum.java +++ b/sgzb-common/sgzb-common-core/src/main/java/com/bonus/sgzb/common/core/utils/HttpCodeEnum.java @@ -1,4 +1,4 @@ -package com.bonus.sgzb.common.core.enums; +package com.bonus.sgzb.common.core.utils; public enum HttpCodeEnum { // 成功 @@ -19,7 +19,7 @@ public enum HttpCodeEnum { EMAIL_NOT_NULL(511, "邮箱不能为空"), NICKNAME_EXIST(512, "昵称已存在"), LOGIN_ERROR(505, "用户名或密码错误"), - REPEATE_ERROR(599, "不允许重复提交,请稍候再试"); + REPEATE_ERROR(600, "不允许重复提交,请稍候再试"); int code; String msg; 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 index 9732785..20e83c1 100644 --- 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 @@ -2,8 +2,8 @@ package com.bonus.sgzb.common.aspect; import com.alibaba.fastjson2.JSON; import com.bonus.sgzb.common.annotation.PreventRepeatSubmit; -import com.bonus.sgzb.common.core.enums.HttpCodeEnum; -import com.bonus.sgzb.common.core.exception.ServiceException; +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; @@ -24,7 +24,7 @@ import java.util.concurrent.TimeUnit; @Component public class PreventRepeatSubmitAspect { private static final Logger LOG = LoggerFactory.getLogger(PreventRepeatSubmitAspect.class); - private static final String HEAD_AUTHORIZATION = "Authorization"; + private static final String header = "Authorization"; @Autowired private RedisCache redisCache; @@ -37,21 +37,32 @@ public class PreventRepeatSubmitAspect { @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(HEAD_AUTHORIZATION).trim(); + // 唯一值(没有消息头则使用请求地址) + 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 ServiceException(HttpCodeEnum.REPEATE_ERROR); + throw new BusinessException(HttpCodeEnum.REPEATE_ERROR); } return pjp.proceed(); } diff --git a/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/aspect/PreventRepeatSubmitAspect.java b/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/aspect/PreventRepeatSubmitAspect.java index 4105bc0..40aa21a 100644 --- a/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/aspect/PreventRepeatSubmitAspect.java +++ b/sgzb-modules/sgzb-system/src/main/java/com/bonus/sgzb/system/aspect/PreventRepeatSubmitAspect.java @@ -1,8 +1,9 @@ package com.bonus.sgzb.system.aspect; import com.alibaba.fastjson2.JSON; -import com.bonus.sgzb.common.core.enums.HttpCodeEnum; +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 org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around;