SpringCloudGateway 自定义局部过滤器
场景:
将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务
AllToOneGatewayFilterFactory
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;@Component
@Slf4j
public class AllToOneGatewayFilterFactory extends AbstractGatewayFilterFactory<AllToOneGatewayFilterFactory.Config> {public AllToOneGatewayFilterFactory() {super(Config.class);}@Overridepublic GatewayFilter apply(Config config) {return (exchange, chain) -> {ServerHttpRequest request = exchange.getRequest();request.getURI();// 替换路径String path = request.getPath().toString();ServerHttpRequest modifiedRequest = request.mutate().header(config.headerName, path).path(config.getToPath()).build();exchange = exchange.mutate().request(modifiedRequest).build();log.info("AllToOne: headers{{}:{}}, {} ---> {}", config.getHeaderName(),path, request.getURI(), modifiedRequest.getURI());return chain.filter(exchange);};}@Setter@Getterpublic static class Config {private String headerName;private String toPath;}
}
spring:cloud:gateway:httpclient:ssl:useInsecureTrustManager: trueroutes:- id: AllToOne_fnpturi: http://localhost:19982predicates:- Path=/**filters:- name: AllToOneargs:headerName: api-pathtoPath: /api/unified
注意:1.类名必须以GatewayFilterFactory结尾否则会出现不识别 的情况
2.配置的filters -name 的值为类的前缀(截取GatewayFilterFactory之后的)