接口重复调用限制过滤器

注解类

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 重复请求过滤器
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface RepeatRequest {
    /** 请求间隔时间,单位秒,该时间范围内的请求为重复请求 */
    int intervalTime() default 3;

    /** 是否根据参数进行校验 */
    boolean checkParameter() default false;

    /** 是否根据用户进行校验 */
    boolean checkUser() default true;

    /** 返回的提示信息 */
    String msg() default "请不要频繁重复请求!";
}

过滤器

/**过滤器案例代码**/

//import cn.hutool.cache.CacheUtil;
//import cn.hutool.cache.impl.TimedCache;
//import cn.hutool.core.date.DateUnit;
//import com.alibaba.fastjson.JSON;
//import ${Cmn_Java_Exception}.CommonExceptionCode;
//import ${Cmn_Java_Exception}.ServiceException;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.aspectj.lang.reflect.CodeSignature;
//import org.aspectj.lang.reflect.MethodSignature;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.core.annotation.Order;
//import org.springframework.stereotype.Component;
//import org.springframework.web.context.request.RequestContextHolder;
//import org.springframework.web.context.request.ServletRequestAttributes;
//
//import javax.annotation.PostConstruct;
//import javax.servlet.http.HttpServletRequest;
//import java.lang.reflect.Method;
//import java.util.HashMap;
//import java.util.Map;
///**
// * @Description : 重复请求过滤器
// * @Author : cxw
// * @Date : 2022/11/30 10:56
// * @Version : 1.0
// **/
//@Component
//@Aspect
//@Order(100)
//public class RepeatRequestFilter {
//
//    Logger logger= LoggerFactory.getLogger(RepeatRequestFilter.class);
//
//    private static final String SUFFIX = "C_";
//
//    /**
//     * 缓存数组,默认30秒过期
//     */
//    TimedCache<String, String> timedCache = CacheUtil.newTimedCache(DateUnit.SECOND.getMillis() * 5);
//
//    @PostConstruct
//    public void inti(){
//        //启动定时任务,每30秒清理一次过期条目,注释此行首次启动仍会清理过期条目
//        timedCache.schedulePrune(DateUnit.SECOND.getMillis() * 30);
//    }
//
//    // 定义 注解 类型的切点
//    @Pointcut("@annotation(${Ctr_Java_Common_Interceptor}.AvoidRepeatRequest)")
//    public void arrPointcut() {}
//
//    // 实现过滤重复请求功能
//    @Around("arrPointcut()")
//    public Object arrBusiness(ProceedingJoinPoint joinPoint) throws Throwable {
//        // 获取 redis key,由 session ID 和 请求URI 构成
//        ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
//        HttpServletRequest request = sra.getRequest();
//        String key = SUFFIX + "_" + request.getRequestURI();
//
//        // 获取方法的 AvoidRepeatRequest 注解
//        Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
//        AvoidRepeatRequest arr = method.getAnnotation(AvoidRepeatRequest.class);
//        if(arr!=null&&arr.checkUser()){
//            key+="_"+ request.getSession().getId();
//        }
//        if(arr!=null&&arr.checkParameter()){
//            Map<String, Object> nameAndValue = getNameAndValue(joinPoint);
//            if(nameAndValue!=null&&nameAndValue.size()>0){
//                key+="_"+ JSON.toJSONString(nameAndValue);
//            }
//        }
//        // 判断是否是重复的请求
//        if (arr!=null&&continceKey(key,arr.intervalTime())) {
//            throw new ServiceException(CommonExceptionCode.REPEAT_REQUEST,arr.msg());
//        }
//
//        return joinPoint.proceed();
//    }
//
//    /**
//     * 验证
//     * @param key
//     * @param intervalTime 单位秒
//     * @return
//     */
//    private boolean continceKey(String key, int intervalTime) {
//        String date = timedCache.get(key);
//        timedCache.put(key,"", DateUnit.SECOND.getMillis() * intervalTime);
//        if(date!=null){
//            return true;
//        }
//        return false;
//    }
//
//    /**
//     * 获取参数Map集合
//     * @param joinPoint
//     * @return
//     */
//    private Map<String, Object> getNameAndValue(ProceedingJoinPoint joinPoint) {
//        Map<String, Object> param = new HashMap<>();
//        Object[] paramValues = joinPoint.getArgs();
//        String[] paramNames = ((CodeSignature)joinPoint.getSignature()).getParameterNames();
//        for (int i = 0; i < paramNames.length; i++) {
//            param.put(paramNames[i], paramValues[i]);
//        }
//        return param;
//    }
//}

 

posted @ 2023-04-28 13:36  扰扰  阅读(41)  评论(0编辑  收藏  举报