記錄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