spring - 更改 WebFilter 中 ServerWebExchange 响应的正文

标签 spring spring-webflux spring-filter

我正在尝试在 spring webflux 中创建一个应用程序。但有很多东西我在文档中找不到。
我有一个网络过滤器,我想在响应周围添加一个包装器。示例:
之前回复:

{
    "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 中的响应输出?

最佳答案

如 javadoc 中所述,WebFilter是为与应用程序无关的跨领域问题而设计的。 WebFilters通常会改变请求 header ,向交换添加属性或完全处理响应,而不委托(delegate)给链的其余部分。

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

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

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

关于spring - 更改 WebFilter 中 ServerWebExchange 响应的正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47315363/

相关文章:

java - 在 Tomcat CP 中找不到 DB2 驱动程序,但 Commons 工作正常?

Spring ,webflux : The getRemoteAddress method of the ServerHttpRequest object returns null when request performed from WebTestClient

需要 Java Mono 或 Flux 作为使用 webflux 模拟 "when"的响应

java - spring boot - 从过滤器返回 pojo 响应

Spring Boot 使用配置文件启用/禁用嵌入式 tomcat

java - 为什么将 @Repository 放在 Spring Data JPA 接口(interface)之上?

spring-webflux - 如何在 webflux 中获取客户端 IP?

spring - 如何在 Spring WebFilter 中添加自定义 header ?

java - 检索 spring boot 中的特定字段

jquery - 如何在JSP页面中实时显示通知