在WebFilter中更改ServerWebExchange响应的正文

Jan*_*tze 5 spring spring-webflux spring-filter

我正在尝试在spring webflux中进行应用。但是我在文档中找不到很多东西。
我有一个Webfilter,我想在响应周围添加包装器。示例:
在以下情况下回复:

{
    "id": 1,
    "name": "asdf"
}
Run Code Online (Sandbox Code Playgroud)

之后的回应:

{
    "status": "success",
    "data": {
        "id": 1,
        "name": "asdf"
    }
}
Run Code Online (Sandbox Code Playgroud)

这是当前的WebFilter:

@Component
public class ResponseWrapperFilter implements WebFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {
        // Add wrapper to the response content...

        return webFilterChain.filter(serverWebExchange);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我找不到获取或编辑响应正文的方法。
如何更改中的响应输出WebFilter?

Bri*_*zel 4

正如 javadoc 中所述,WebFilter它是针对与应用程序无关的横切问题而设计的。WebFilters通常会改变请求标头、向交换添加属性或完全处理响应,而不委托给链的其余部分。

我认为您想要实现的目标并不容易实现,甚至不应该以这种方式实现。在原始交换级别,您正在处理 a Flux<DataBuffer>,它是随机分成字节组的响应正文。

您可以以某种方式将响应包装在过滤器中,并用于将Flux.concat数据添加到处理程序编写的实际响应中。但是关于编码、无限流等有很多问题。

也许这是一个应该在该级别实现的问题Encoder,因为您可以将该行为限制为特定的媒体类型。