赞
踩
思路
springboot示例代码
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AccessLimit {
int seconds() default 1;
int maxCount() default 20;
}
@Slf4j
public class AccessLimitInterceptor implements HandlerInterceptor {
@Autowired
private RedisUtil redisUtil;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if(handler instanceof HandlerMethod){
HandlerMethod handlerMethod = (HandlerMethod) handler;
AccessLimit accessLimit = handlerMethod.getMethodAnnotation(AccessLimit.class);
if(accessLimit == null) return true;
int seconds = accessLimit.seconds();
int maxCount = accessLimit.maxCount();
String url = request.getRequestURI();
String key = RedisKey.accessLimit(url);
if(redisUtil.hasKey(key)){
Integer count = redisUtil.get(key);
if(count == null) return true;
if(count >= maxCount) throw new APIException(APICode.SYSTEM_BUSY);
redisUtil.increment(key, 1);
}else {
redisUtil.set(key, 1, seconds);
}
}
return true;
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public AccessLimitInterceptor accessLimitInterceptor(){
return new AccessLimitInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registration = registry.addInterceptor(accessLimitInterceptor());
registration.addPathPatterns("/**");
registration.excludePathPatterns(
"/",
"/**/swagger-resources/**",
"/**/*.html",
"/**/*.js",
"/**/*.css"
);
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。