【问题标题】:How to configure Spring DataBuffer size on WebFilter如何在 WebFilter 上配置 Spring DataBuffer 大小
【发布时间】:2020-04-05 04:07:11
【问题描述】:

我从客户端获取了一个 gzip 压缩的内容,我需要在它到达控制器之前对其进行解压缩,否则我会遇到杰克逊解析异常。

我创建了一个 WebFilter 来包装请求并将正文映射到一个缩小的字节数组,如下所示:

  @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;
        }
      });
    }

但是,当请求正文太大时,数据缓冲区不包含所有数据,因此会出现流异常。

任何想法如何配置数据缓冲区或如何接受 gzip 压缩的内容?

【问题讨论】:

    标签: spring-boot gzip spring-webflux reactor-netty


    【解决方案1】:

    我认为最好的方法是依赖 Netty 实现,并将服务器配置为使用 Netty 的支持。

    您可以创建自定义 Reactor Netty 服务器的组件(或直接从 @Bean 方法返回 this 的新实例):

    @Component
    public class RequestInflateCustomizer implements NettyServerCustomizer {
    
        @Override
        public HttpServer apply(HttpServer httpServer) {
            return httpServer.tcpConfiguration(
                    tcp -> tcp.doOnConnection(conn -> conn.addHandlerFirst(new HttpContentDecompressor())));
        }
    
    }
    

    【讨论】:

    猜你喜欢
    • 2020-06-06
    • 2021-07-27
    • 1970-01-01
    • 2018-09-21
    • 2012-10-08
    • 2016-11-22
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多