我想修改Sping Boot 应用程序生成的每个响应。为此,我创建了一个WebFilter组件,如下所示:
@Component
public class EncryptionFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
Decorator decorator = new Decorator(exchange.getResponse());
return chain.filter(exchange.mutate().response(decorator).build());
}
public class Decorator extends ServerHttpResponseDecorator {
public Decorator(ServerHttpResponse delegate) {
super(delegate);
}
@Override
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
Mono<DataBuffer> modifiedBody = Mono.from(body)
.map(dataBuffer -> {
byte[] content = new byte[dataBuffer.readableByteCount()];
dataBuffer.read(content);
String originalContent = new String(content, StandardCharsets.UTF_8);
String modifiedContent = originalContent + " Modified";
return getDelegate().bufferFactory().wrap(modifiedContent.getBytes(StandardCharsets.UTF_8));
});
return super.writeWith(modifiedBody);
}
}
}
字符串
我可以看到我的过滤器被调用,我可以读取原始响应。然而,客户端仍然接收原始响应主体。我的假设是,在我实际修改之前,响应已经写入客户端。
使用@Order
注解似乎没有效果,我已经尝试了最低和最高优先级。我还尝试禁用所有其他过滤器,所以这个过滤器是唯一正在执行的过滤器。
1条答案
按热度按时间vhmi4jdf1#
您还需要重写
Content-Length
头,如下所示:字符串
这解决了使用以下端点测试的问题:
型
回应:
测试修改