美文网首页
API 安全机制 | 流控

API 安全机制 | 流控

作者: 乌鲁木齐001号程序员 | 来源:发表于2020-07-11 23:02 被阅读0次

    流控 | 流量控制

    • 流控要做在所有安全机制的最前头;
    • 流控有针对整个集群的流控,有针对单个服务的流控;

    流控 | 单个服务的流控

    基于 Guava 的 RateLimiter 的实现
    package com.lixinlei.security.api.filter;
    
    import java.io.IOException;
    
    import javax.servlet.FilterChain;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.core.annotation.Order;
    import org.springframework.http.HttpStatus;
    import org.springframework.stereotype.Component;
    import org.springframework.web.filter.OncePerRequestFilter;
    
    import com.google.common.util.concurrent.RateLimiter;
    
    /**
     * OncePerRequestFilter - 保证 Filter 中的逻辑在一个请求中,永远只会被执行 1 次,有些情况下,一个请求会多次过一个 Filter;
     */
    @Component
    @Order(1)
    public class RateLimitFilter extends OncePerRequestFilter {
    
        // 每秒只放一个请求过去
        private RateLimiter rateLimiter = RateLimiter.create(1);
    
        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
                throws ServletException, IOException {
    
            System.out.println(1);
    
            if(rateLimiter.tryAcquire()) {
                filterChain.doFilter(request, response);
            } else {
                response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());
                response.getWriter().write("too many request!!!");
                response.getWriter().flush();
                return;
            }
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:API 安全机制 | 流控

          本文链接:https://www.haomeiwen.com/subject/ojjwcktx.html