首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring-webflux过滤器来获取请求体。

Spring-webflux过滤器来获取请求体。
EN

Stack Overflow用户
提问于 2019-03-01 05:47:49
回答 1查看 5.4K关注 0票数 2

我需要在过滤器中获取整个请求体,并将其转换为字符串。下面是我的代码,但控制台上没有打印任何内容。

代码语言:javascript
复制
@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;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2019-03-04 13:46:43

控制台上没有打印任何内容,因为您没有订阅decodedRequest,因为我们知道一个反应方面:

在你订阅之前什么都不会发生

但是,如果这样做,您将在控制台上看到打印的正文,但您的代码将无法工作,因为下一个操作符无法读取正文,您将得到IllegalStateException(只允许一个连接接收订阅服务器。)

那么,怎么解决呢?

  1. ServerWebExchange创建自己的包装器(请在此处阅读:How to log request and response bodies in Spring WebFlux)
  2. HttpMessageDecoder中的日志体。例如,如果您看到AbstractJackson2Decoder,您将发现Spring将缓冲区解码为对象的代码,并可以对其进行日志记录:
代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54938638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档