在使用spring cloud gateway的时候,有时候下游的某个服务返回的json非常大,此时经过gateway进行返回的时候就会被自动阶段,那么前端接收到的信息就不完整,解析也会报错,此问题如何解决呢?其实很简单,在spring cloud gateway项目里面添加如下的filter即可,完整代码如下:
package org.gateway.service.filter; import org.apache.commons.codec.Charsets; import org.reactivestreams.Publisher; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; 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.core.io.buffer.DefaultDataBufferFactory; import org.springframework.http.HttpStatus; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.http.server.reactive.ServerHttpResponseDecorator; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @Component @Slf4j public class ResponseAllFilter implements GlobalFilter, Ordered { @Override public int getOrder() { return -2; } @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { try { // 获取response的 返回数据 ServerHttpResponse originalResponse = exchange.getResponse(); DataBufferFactory bufferFactory = originalResponse.bufferFactory(); HttpStatus statusCode = originalResponse.getStatusCode(); if (statusCode == HttpStatus.OK) { ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) { @Override public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) { // 判断服务返回的数据类型进行拦截,根据自己的业务进行修改 Flux<? extends DataBuffer> fluxBody = Flux.from(body); return super.writeWith(fluxBody.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 responseData = new String(content, Charsets.UTF_8); responseData = responseData.replaceAll(":null", ":\"\""); byte[] uppedContent = responseData.getBytes(Charsets.UTF_8); return bufferFactory.wrap(uppedContent); })); } }; return chain.filter(exchange.mutate().response(decoratedResponse).build()); } return chain.filter(exchange); } catch (Exception e) { log.error(e.getMessage(), e); return chain.filter(exchange); } } }
然后再启动spring cloud gateway项目,可以看到被阶段的json信息全部返回了。
备注:
1、在高版本的spring cloud gateway里面已经没发现过被截断的问题了。
还没有评论,来说两句吧...