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(); } } } }