在WebFilter中更改ServerWebExchange响应的主体

时间:2017-11-15 19:05:35

标签: spring spring-webflux spring-filter

我正在尝试在spring webflux中创建一个应用程序。但是我在文档中找不到很多东西 我有一个webfilter,我想在响应中添加一个包装器。例如:
之前有回应:

{
    "id": 1,
    "name": "asdf"
}

之后的回复:

{
    "status": "success",
    "data": {
        "id": 1,
        "name": "asdf"
    }
}

目前这是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);
    }
}

但我找不到获取或编辑回复正文的方法 如何更改WebFilter

中的响应输出

1 个答案:

答案 0 :(得分:2)

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

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

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

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