记录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;
    }
posted @ 2021-01-13 16:34  忆小雨  阅读(1622)  评论(0)    收藏  举报