【问题标题】:How to get Request header values in Spring Cloud Gateway如何在 Spring Cloud Gateway 中获取请求标头值
【发布时间】:2018-12-18 08:34:54
【问题描述】:
我正在使用 Spring Cloud Gateway 实现 API 路由,在其中一个用例中,我需要从传入请求中获取标头值并将其用于某些处理,进一步将此处理后的值添加到传出(路由)API 调用作为标头.如何从 routeBuilder 中的传入 API 调用中获取标头值?
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder routeBuilder) {
return routeBuilder.routes()
.route(r -> r.path("/api/v1/**")
.setRequestHeader("testKey", "testValue")
.uri("URL"))
.build();
}
【问题讨论】:
标签:
spring-boot
spring-cloud-gateway
【解决方案1】:
从 Predicate 获取传入的请求/响应。
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes().route("default-api-route", new Function<PredicateSpec, Route.AsyncBuilder>() {
@Override
public Route.AsyncBuilder apply(PredicateSpec predicateSpec) {
return predicateSpec.predicate(new Predicate<ServerWebExchange>() {
@Override
public boolean test(ServerWebExchange serverWebExchange) {
// get request header here
return false;
}
}).uri("http://httpbin.org").order(10000);
}
}).build();
}
【解决方案2】:
您可以为此编写自定义过滤器。它只是一种解决方法,不确定这样做的最佳方法是什么:
public class SomeFilterFactory
extends AbstractGatewayFilterFactory<SomeFilterFactory.SomeConfig> {
public SomeFilterFactory() {
super(SomeFilterFactory.SomeConfig.class);
}
@Override
public GatewayFilter apply(SomeFilterFactory.SomeConfig config) {
return (exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
String someHeader = request.getHeaders().getFirst("someHeader");
// do your things here
return chain.filter(exchange);
};
}
public static class SomeConfig {
// your config if required
// or use name value config
}
}