@Bean @Order(-100000) public GlobalFilter modifyResponseFilter() { return (exchange, chain) -> { ServerHttpResponse originalResponse = exchange.getResponse(); DataBufferFactory bufferFactory = originalResponse.bufferFactory(); ServerHttpResponseDecorator responseDecorator = new ServerHttpResponseDecorator(originalResponse) { @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 -> { byte[] buff = new byte[dataBuffer.readableByteCount()]; dataBuffer.read(buff); String str = new String(buff); ApiResult apiResult = new ApiResult(); apiResult.setS(originalResponse.getRawStatusCode()); apiResult.setR(JSONUtil.parseObj(str)); byte[] newBuff = JSONUtil.toJsonStr(apiResult).getBytes(StandardCharsets.UTF_8); return bufferFactory.wrap(newBuff); })); } return super.writeWith(body); } }; return chain.filter(exchange.mutate().response(responseDecorator).build()); }; }
如上代码在配置类里面定义了一个bean,路由的接口会走filter方法但不会走writeWith,原因是@Order(-100000)不起作用,把上面代码改成如下就没问题了
@Component public class GlobalModifyResponseFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpResponse originalResponse = exchange.getResponse(); DataBufferFactory bufferFactory = originalResponse.bufferFactory(); ServerHttpResponseDecorator responseDecorator = new ServerHttpResponseDecorator(originalResponse) { @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 -> { byte[] buff = new byte[dataBuffer.readableByteCount()]; dataBuffer.read(buff); String str = new String(buff); byte[] newBuff = JSONUtil.toJsonStr(ApiResultVO.success(str)).getBytes(StandardCharsets.UTF_8); return bufferFactory.wrap(newBuff); })); } return super.writeWith(body); } }; return chain.filter(exchange.mutate().response(responseDecorator).build()); } @Override public int getOrder() { return Integer.MIN_VALUE; } }