我需要在过滤器中获取整个请求体,并将其转换为字符串。下面是我的代码,但控制台上没有打印任何内容。
@Component
public class WebFilter01 implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange serverWebExchange,
WebFilterChain webFilterChain) {
Flux<DataBuffer> requestBody = serverWebExchange.getRequest().getBody();
Flux<String> decodedRequest = requestBody.map(databuffer -> {
return decodeDataBuffer(databuffer);
});
decodedRequest.doOnNext(s -> System.out.print(s));
return webFilterChain.filter(serverWebExchange);
}
protected String decodeDataBuffer(DataBuffer dataBuffer) {
Charset charset = StandardCharsets.UTF_8;
CharBuffer charBuffer = charset.decode(dataBuffer.asByteBuffer());
DataBufferUtils.release(dataBuffer);
String value = charBuffer.toString();
return value;
}
}发布于 2019-03-04 13:46:43
控制台上没有打印任何内容,因为您没有订阅decodedRequest,因为我们知道一个反应方面:
在你订阅之前什么都不会发生
但是,如果这样做,您将在控制台上看到打印的正文,但您的代码将无法工作,因为下一个操作符无法读取正文,您将得到IllegalStateException(只允许一个连接接收订阅服务器。)
那么,怎么解决呢?
ServerWebExchange创建自己的包装器(请在此处阅读:How to log request and response bodies in Spring WebFlux)HttpMessageDecoder中的日志体。例如,如果您看到AbstractJackson2Decoder,您将发现Spring将缓冲区解码为对象的代码,并可以对其进行日志记录:try {
Object value = reader.readValue(tokenBuffer.asParser(getObjectMapper()));
if (!Hints.isLoggingSuppressed(hints)) {
LogFormatUtils.traceDebug(logger, traceOn -> {
String formatted = LogFormatUtils.formatValue(value, !traceOn);
return Hints.getLogPrefix(hints) + "Decoded [" + formatted + "]";
});
}
return value;
}https://stackoverflow.com/questions/54938638
复制相似问题