Spring Cloud Gateway 实现全局过滤器 GlobalFilter

实现下全局过滤器GlobalFilter和顺序接口Ordered,不需要在配置文件配置,系统初始化时会自动加载,会作用在所用路由上,这里要注意的是,Ordered的 getOrder() 方法是用来给过滤器设置优先级,值越小优先级越高。还有filter(exchange,chain)方法,在该方法中,先记录了请求的开始时间,并保存在ServerWebExchange中,此处是一个“pre”类型的过滤器,然后再chain.filter的内部类中的run()方法中相当于”post”过滤器,在此处打印了请求接口的host、端口、URL、时间。要记得把filter注册到Spring IOC容器中(打@Component注解)。

@RefreshScope
@Slf4j
@Component
public class testFilter implements GlobalFilter, Ordered {

    @Value("${encrypt-excludes-predicates}")
    private String predicates;
    private static final String BEGIN_TIME = "beginTime";
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("*******************"+predicates+"******************");
        exchange.getAttributes().put(BEGIN_TIME, DateUtil.current());

        return chain.filter(exchange).then(
                Mono.fromRunnable(() -> {
                    Long startTime = exchange.getAttribute(BEGIN_TIME);
                    if (startTime != null) {
                        log.info("=============================Gateway打印日志开始===============================");
                        log.info("访问接口host: " + exchange.getRequest().getURI().getHost());
                        log.info("访问接口端口: " + exchange.getRequest().getURI().getPort());
                        log.info("访问接口URL: " + exchange.getRequest().getURI().getPath());
                        log.info("访问接口URL参数: " + exchange.getRequest().getURI().getRawQuery());
                        log.info("访问接口时间: " + (DateUtil.current() - startTime) + "ms");
                        log.info("=============================Gateway打印日志结束===============================");
                    }
                })
        );
    }

    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }

    public  boolean inContainURL(String url, String excludes) {
                    boolean var2 = false;
                    if (excludes != null && !"".equals(excludes.trim())) {
                       String[] var3 = excludes.split(",");
                        StringBuffer var4 = new StringBuffer(url);

                            for(int i = 0; i < var3.length; ++i) {
                                    if (var4.indexOf(var3[i]) > 1) {
                                            var2 = true;
                                        break;
                                        }
                            }
                    }
                    return var2;
                }

}

 

posted @ 2022-04-15 10:07  DreamCatt  阅读(751)  评论(0)    收藏  举报