记录springboot 使用注解,解决请求过于频繁、重复提交的问题


主要是通过将请求次数存入redis 实现

注解

/**
 * @author : ziyue
 * @date : 2020-09-01 9:31
 * @description :
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequestLimit {
    /**
     * 请求次数
     */
    int count() default 1;

    /**
     * 限制时间(秒)
     */
    long time() default 5;
}

aop

 /**
     * 限制 一段时间可以请求的次数
     * @param proceedingJoinPoint
     * @param requestLimit
     * @return
     * @throws Throwable
     */
    @Around(value = "@annotation(requestLimit)")
    @ResponseBody
    public Object requestLimit(ProceedingJoinPoint proceedingJoinPoint, RequestLimit requestLimit) throws Throwable {
        ServletRequestAttributes attributes =(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        String userId = TokenUtilApi.getUserId(request);
        String methodName = proceedingJoinPoint.getSignature().getName();
        StringBuffer redisKey = new StringBuffer();
        redisKey.append("requestLimit:").append(methodName).append(":").append(userId);
        Integer requestCount = (Integer) redisService.get(redisKey.toString());
        requestCount=requestCount==null?0:requestCount;
        Object proceed =null;
        if(requestCount<requestLimit.count()){
            redisService.put(redisKey.toString(),requestCount+1,requestLimit.time());
            proceed = proceedingJoinPoint.proceed();
        }else{
            return ResultUtil.errorResponse(-1,"操作频繁,请 "+redisService.getExpire(redisKey.toString())+" 秒后重试");
        }
        return proceed;
    }


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM