1、 配置拦截器css
package com.tg.higo.couponplatform.config; import com.tg.higo.couponplatform.web.common.RateLimiterInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * * @Description */ @Configuration public class WebConfig implements WebMvcConfigurer { // 多个拦截器组成一个拦截器链 // addPathPatterns 用于添加拦截规则 // excludePathPatterns 用户排除拦截 @Override public void addInterceptors(InterceptorRegistry registry) { //注册TestInterceptor拦截器 InterceptorRegistration registration = registry.addInterceptor(new RateLimiterInterceptor()); registration.addPathPatterns("/**"); //全部路径都被拦截 // registration.excludePathPatterns( //添加不拦截路径 // "你的登录路径", //登陆 // "/**/*.html", //html静态资源 // "/**/*.js", //js静态资源 // "/**/*.css", //css静态资源 // "/**/*.woff", // "/**/*.ttf" // ); } }
2、 设置qps限流拦截(可选择性针对接口)html
package com.tg.higo.couponplatform.web.common; import com.alibaba.fastjson.JSONObject; import com.google.common.util.concurrent.RateLimiter; import com.tgframework.starter.common.web.advice.commonresponse.CommonException; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; /** * * @Description */ @Slf4j public class RateLimiterInterceptor extends HandlerInterceptorAdapter { // QPS限流 private final static int QPS_LIMIT_AMOUNT = 200; private final static RateLimiter rateLimiter = RateLimiter.create(QPS_LIMIT_AMOUNT); private final static String FAIL_RESPONSE = new JSONObject() .fluentPut("code", 0) .fluentPut("msg", "请稍后再试") .toJSONString(); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String requestURI = request.getRequestURI(); if ((request.getServletPath().contains("/applet/draw") && !rateLimiter.tryAcquire()) || (request.getServletPath().contains("/applet/personalCouponList") && !rateLimiter.tryAcquire()) ) { log.warn("[限流器] 请求QPS已满{},进行限流拦截,URI={}", QPS_LIMIT_AMOUNT,requestURI); writeFailResponse(response, requestURI); return false; // throw new CommonException("0","请稍后再试"); } return true; } private void writeFailResponse(HttpServletResponse response, String requestURI) { PrintWriter writer = null; try { response.setStatus(200); response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE); writer = response.getWriter(); writer.write(FAIL_RESPONSE); } catch (IOException e) { log.error("[限流器] 回写限流响应时发生异常,URI={}", requestURI, e); } finally { if (null != writer) { writer.close(); } } } }