Spring boot 如何在WebFilter上配置Spring数据缓冲区大小
我正在从客户端获取一个gzip内容,我需要在它到达控制器之前对它进行解压缩,否则我会得到一个jackson解析异常 我创建了一个WebFilter,它将请求打包并将正文映射到一个缩小的字节数组中,如下所示:Spring boot 如何在WebFilter上配置Spring数据缓冲区大小,spring-boot,gzip,spring-webflux,reactor-netty,Spring Boot,Gzip,Spring Webflux,Reactor Netty,我正在从客户端获取一个gzip内容,我需要在它到达控制器之前对它进行解压缩,否则我会得到一个jackson解析异常 我创建了一个WebFilter,它将请求打包并将正文映射到一个缩小的字节数组中,如下所示: @Override public Flux<DataBuffer> getBody() { return request.getBody().map(requestDataBuffer -> { try { GZI
@Override
public Flux<DataBuffer> getBody() {
return request.getBody().map(requestDataBuffer -> {
try {
GZIPInputStream gzipInputStream = new GZIPInputStream(requestDataBuffer.asInputStream());
StringWriter writer = new StringWriter();
IOUtils.copy(gzipInputStream, writer, UTF_8);
byte[] targetArray = writer.toString().getBytes();
return new DefaultDataBufferFactory().wrap(targetArray);
}
catch (IOException e) {
LOG.error("failed to create gzip input stream. content-encoding is {}", request.getHeaders().getFirst(CONTENT_ENCODING));
return requestDataBuffer;
}
});
}
@覆盖
公共机构({
返回request.getBody().map(requestDataBuffer->{
试一试{
GZIPInputStream GZIPInputStream=新的GZIPInputStream(requestDataBuffer.asInputStream());
StringWriter编写器=新的StringWriter();
IOUtils.copy(gzip输入流,编写器,UTF_8);
字节[]targetArray=writer.toString().getBytes();
返回新的DefaultDataBufferFactory().wrap(targetArray);
}
捕获(IOE异常){
错误(“未能创建gzip输入流。内容编码为{}”,request.getHeaders().getFirst(content_encoding));
返回请求数据缓冲;
}
});
}
但是,当请求主体太大时,数据缓冲区并不包含所有数据,因此我会得到流异常
有没有关于如何配置数据缓冲区或如何接受gzip内容的想法?我认为最好的方法是依靠Netty实现,并将服务器配置为使用Netty提供的支持 您可以创建一个组件(或直接从
@Bean
方法返回此组件的新实例),该组件自定义Reactor Netty服务器:
@Component
public class RequestInflateCustomizer implements NettyServerCustomizer {
@Override
public HttpServer apply(HttpServer httpServer) {
return httpServer.tcpConfiguration(
tcp -> tcp.doOnConnection(conn -> conn.addHandlerFirst(new HttpContentDecompressor())));
}
}
你可以在这里看到类似的东西