@Target({ Elemen}) @Retention) @Documented public @interface RequestLimit { /** * 规定时间内(单位:秒):默认两秒 * */ long lockTime() default 2L; /** * 允许访问的最大次数(默认1次) */ int limitCount() default 1; }
@Aspect @Component public class RequestLimitAspect { @Around("@annotation(requestLimit)") @SneakyThrows public Object doBefore(ProceedingJoinPoint point, RequestLimit requestLimit) { HttpServletRequest request = ((ServletRequestAttributes) Reque()).getRequest(); String requestURI = reque(); //客户端IP String clientIP = Servle(request); //客户端请求头的userAgent String header = reque("User-Agent"); //MD5加密后的值 String Key = SecureU(clientIP + requestURI + header); Object o = Redi(Key); //第一次提交 if (o == null) { redi(Key, 1, reque()); } else { if () == 1) { return Re(-1, "不允许重复提交"); } Integer redisCount = (Integer) o; Sy("redisCount = " + redisCount); if (redisCount > reque()) { return Re(-1, "操作频繁,稍后再试"); } Redi(Key, redisCount + 1, reque()); } return (); } }
@RequestLimit @RequestLimit(lockTime = 30 * 60L, limitCount = 10)