1@Component 2@Slf4j 3public class MyFilter implements Filter { 4 5 6 private static volatile long startTime = System.currentTimeMillis(); 7 8 // 时间窗口 9 private static final long windowTime = 1000L; 10 11 // 1s只能通过200个请求 12 private static final int door = 200; 13 14 private static final AtomicInteger bear = new AtomicInteger(0); 15 16 @Override 17 public void init(FilterConfig filterConfig) throws ServletException { 18 Filter.super.init(filterConfig); 19 } 20 21 @Override 22 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 23 int count = bear.incrementAndGet(); 24 if (count == 1) { 25 startTime = System.currentTimeMillis(); 26 } 27 long now = System.currentTimeMillis(); 28 log.info("拦截了请求, count: {}", count); 29 log.info("时间窗口: {}ms, count: {}", (now - startTime), count); 30 if (now - startTime <= windowTime) { 31 if (count > door) { // 超过了阈值 32 // 限流操作 33 log.info("限流, 拦截了请求, count: {}", count); 34 HttpServletResponse response = (HttpServletResponse) servletResponse; 35 response.setStatus(HttpStatus.OK.value()); 36 response.setContentType(MediaType.APPLICATION_JSON_VALUE); 37 response.setCharacterEncoding(StandardCharsets.UTF_8.toString()); 38 response.getWriter().print(JSONUtil.toJsonStr(Result.error("402", "接口请求过于频繁"))); 39 return; 40 } 41 } else { 42 startTime = System.currentTimeMillis(); 43 bear.set(1); 44 } 45 HttpServletRequest request = (HttpServletRequest) servletRequest; 46 filterChain.doFilter(servletRequest, servletResponse); 47 log.info("接口请求的路径:{}", request.getServletPath()); 48 } 49 50 @Override 51 public void destroy() { 52 Filter.super.destroy(); 53 } 54 55}
通过过滤器实现简单的限流操作

把帆帆喂饱
2023-01-14
1012 0 0
点赞
收藏
评论区
加载中...