package com.test.gateway.filter; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.reactivestreams.Publisher; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.cloud.gateway.filter.NettyWriteResponseFilter; import org.springframework.core.Ordered; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBufferFactory; import org.springframework.core.io.buffer.DataBufferUtils; import org.springframework.http.server.reactive.ServerHttpResponseDecorator; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.nio.charset.StandardCharsets; @Slf4j @Component public class HttpResponseFilter implements GlobalFilter, Ordered { private final ObjectMapper mapper = new ObjectMapper(); @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { //从上一个过滤器中 拿返回参数或body return requestDecorator(exchange,chain); } private Mono<Void> requestDecorator(ServerWebExchange exchange, GatewayFilterChain chain) { DataBufferFactory bufferFactory = exchange.getResponse().bufferFactory(); //获取响应体 final ServerHttpResponseDecorator serverHttpResponseDecorator = new ServerHttpResponseDecorator(exchange.getResponse()) { @Override public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) { if (body instanceof Flux) { Flux<? extends DataBuffer> fluxBody = (Flux<? extends DataBuffer>) body; return super.writeWith(fluxBody.map(dataBuffer -> { // probably should reuse buffers byte[] content = new byte[dataBuffer.readableByteCount()]; dataBuffer.read(content); //释放掉内存 DataBufferUtils.release(dataBuffer); String s = new String(content, StandardCharsets.UTF_8); byte[] uppedContent = new String(content,StandardCharsets.UTF_8).getBytes(); return bufferFactory.wrap(uppedContent); })); } return super.writeWith(body); } @Override public Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<? extends DataBuffer>> body) { return writeWith(Flux.from(body).flatMapSequential(p -> p)); } }; return chain.filter(exchange.mutate().response(serverHttpResponseDecorator).build()); } @Override public int getOrder() { //WRITE_RESPONSE_FILTER 之前执行 return NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER - 1; } }
springcloud gateway 拦截获取响应实体参数
最新推荐文章于 2024-04-28 13:38:33 发布