puzhibing
2024-08-19 7d348d54c93e1333951c6d20f8ead81d389cd262
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/RequestParamGlobalFilter.java
@@ -42,57 +42,53 @@
 */
@Component
public class RequestParamGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequestDecorator httpRequestDecorator = requestDecorator(exchange);
        return chain.filter(exchange.mutate().request(httpRequestDecorator).build());
    }
    private ServerHttpRequestDecorator requestDecorator(ServerWebExchange exchange) {
        ServerHttpRequestDecorator serverHttpRequestDecorator = new ServerHttpRequestDecorator(exchange.getRequest()) {
            @Override
            public Flux<DataBuffer> getBody() {
                Flux<DataBuffer> body = super.getBody();
                return body.buffer().map(dataBuffers -> {
                    DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
                    DataBuffer join = dataBufferFactory.join(dataBuffers);
                    byte[] content = new byte[join.readableByteCount()];
                    join.read(content);
                    DataBufferUtils.release(join);
                    String bodyStr = new String(content, StandardCharsets.UTF_8);
                    // 转成字节
                    byte[] bytes = bodyStr.getBytes();
                    NettyDataBufferFactory nettyDataBufferFactory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT);
                    DataBuffer buffer = nettyDataBufferFactory.allocateBuffer(bytes.length);
                    buffer.write(bytes);
                    return buffer;
                });
            }
            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders httpHeaders = new HttpHeaders();
                httpHeaders.putAll(super.getHeaders());
                // 由于修改了请求体的body,导致content-length长度不确定,因此需要删除原先的content-length
                httpHeaders.remove(HttpHeaders.CONTENT_LENGTH);
                httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked");
                return httpHeaders;
            }
        };
        return serverHttpRequestDecorator;
    }
    @Override
    public int getOrder()
    {
        return HIGHEST_PRECEDENCE;
    }
   @Override
   public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
      ServerHttpRequestDecorator httpRequestDecorator = requestDecorator(exchange);
      return chain.filter(exchange.mutate().request(httpRequestDecorator).build());
   }
   private ServerHttpRequestDecorator requestDecorator(ServerWebExchange exchange) {
      ServerHttpRequestDecorator serverHttpRequestDecorator = new ServerHttpRequestDecorator(exchange.getRequest()) {
         @Override
         public Flux<DataBuffer> getBody() {
            Flux<DataBuffer> body = super.getBody();
            return body.buffer().map(dataBuffers -> {
               DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
               DataBuffer join = dataBufferFactory.join(dataBuffers);
               byte[] content = new byte[join.readableByteCount()];
               join.read(content);
               DataBufferUtils.release(join);
               String bodyStr = new String(content, StandardCharsets.UTF_8);
               // 转成字节
               byte[] bytes = bodyStr.getBytes();
               NettyDataBufferFactory nettyDataBufferFactory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT);
               DataBuffer buffer = nettyDataBufferFactory.allocateBuffer(bytes.length);
               buffer.write(bytes);
               return buffer;
            });
         }
         @Override
         public HttpHeaders getHeaders() {
            HttpHeaders httpHeaders = new HttpHeaders();
            httpHeaders.putAll(super.getHeaders());
            // 由于修改了请求体的body,导致content-length长度不确定,因此需要删除原先的content-length
            httpHeaders.remove(HttpHeaders.CONTENT_LENGTH);
            httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked");
            return httpHeaders;
         }
      };
      return serverHttpRequestDecorator;
   }
   @Override
   public int getOrder() {
      return HIGHEST_PRECEDENCE;
   }
}