自定義註解 防止重複提交
阿新 • • 發佈:2018-11-28
定義註解
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 防重複提交註解 * @author 向振華 * @date 2018/11/20 15:53 */ @Target(value = {ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface Submit { /** * 防重複時間,預設2s * * @return */ long time() default 2L; /** * 重複提交提示語 * * @return */ String msg() default "請勿重複提交!"; }
註解處理切面
/** * @author 向振華 * @date 2018/11/20 16:13 */ @Order(10)//使用order屬性,設定該類在spring容器中的載入順序 @Aspect @Configuration public class SubmitAspect { @Resource private RedisTemplate redisTemplate; @Around("execution(* com.mmtvip.collection.controller..*.*(..))") public Object getReqAndResInfo(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes; HttpServletRequest request = servletRequestAttributes.getRequest(); // 獲取出方法上的@Submit註解 Method method = ((MethodSignature) proceedingJoinPoint.getSignature()).getMethod(); Submit submit = method.getAnnotation(Submit.class); if (submit != null) { //1.生成防重複提交token,準備放入redis String token = request.getRequestURI() + request.getSession().getId(); //2.若該token已經在redis存在,則認為重複提交了 if (redisTemplate.hasKey(token)) { return new ResponseMessage(-1, submit.msg()); } //3.若該token不存在與redis,則認為可以提交,將token存入redis redisTemplate.opsForValue().set(token, token, submit.time(), TimeUnit.SECONDS); } return proceedingJoinPoint.proceed(); } }