注解类
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; // } //}
标签:lang,arr,调用,接口,key,org,过滤器,import,annotation From: https://www.cnblogs.com/raorao1994/p/17361872.html