springcloudgateway获取请求
时间: 2025-01-11 09:50:10 浏览: 38
### 如何在 Spring Cloud Gateway 中获取 HTTP 请求对象及参数
#### 使用 `ServerWebExchange` 获取请求信息
在 Spring Cloud Gateway 的环境中,所有的请求处理都是基于 `ServerWebExchange` 对象完成的。此对象提供了访问当前HTTP请求和响应的能力[^1]。
```java
@Component
public class CustomGlobalFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
// 打印请求路径
System.out.println("Request Path: " + request.getURI().getPath());
// 处理逻辑...
return chain.filter(exchange);
}
}
```
#### 解决 POST 请求体只能读取一次的问题
由于 Reactor Netty 和 WebFlux 的特性,在 Spring Cloud Gateway 中直接读取请求体会消耗掉输入流,使得后续处理器无法再读取该数据。为了克服这个问题,可以采用缓存请求体的方式:
- 将原始请求转换成新的带有相同属性但可重复读取的内容的新请求;
- 利用自定义过滤器来实现上述功能[^2]。
```java
import org.springframework.core.io.buffer.DataBuffer;
import reactor.core.publisher.Flux;
// 缓存请求体并创建新请求的方法
private static ServerHttpRequest copyRequestBody(ServerHttpRequest request) throws IOException {
Flux<DataBuffer> cachedBody = request.getBody()
.cache();
ServerHttpRequestDecorator decoratedRequest =
new ServerHttpRequestDecorator(request) {
@Override
public Flux<DataBuffer> getBody() {
return cachedBody;
}
};
return decoratedRequest;
}
```
#### 日志记录中的应用实例
当希望在网关层面对所有进入系统的 API 调用做统一的日志管理时,可以通过全局过滤器截获每一个到来的请求,并从中提取必要的元数据以及可能存在的 JSON 形式的负载内容进行记录。
```java
@Slf4j
@Component
public class LoggingFilter extends AbstractGatewayFilterFactory<LoggingFilter.Config> {
private final ObjectMapper objectMapper = new ObjectMapper();
public LoggingFilter() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
try {
String bodyString = extractBodyAsString(exchange);
log.info("Received Request:\nMethod:{}\nPath:{}\nHeaders:{}\nBody:{}",
exchange.getRequest().getMethod(),
exchange.getRequest().getURI().getPath(),
exchange.getRequest().getHeaders(),
bodyString);
return chain.filter(exchange.mutate().request(copyRequestBody(exchange.getRequest())).build());
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
};
}
private String extractBodyAsString(ServerWebExchange exchange) throws Exception {
StringBuilder builder = new StringBuilder();
exchange.getAttributeOrDefault("cached_request_body", "")
.toString()
.chars()
.forEach(c -> builder.append((char)c));
if(builder.length() == 0){
return "";
}
return builder.toString();
}
public static class Config {}
}
```
阅读全文
相关推荐


















