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

浙公网安备 33010602011771号