基於springboot和springcloud版本處理java
<spring-boot.version>2.3.4.RELEASE</spring-boot.version> <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
如下方法親測有效:spring
/** * 網關鑑權 * * @author Bruce Shaw */ @Component public class AuthFilter implements GlobalFilter, Ordered { private static final Logger log = LoggerFactory.getLogger(AuthFilter.class); @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { String uri = exchange.getRequest().getURI().getPath(); // 校驗參數 ServerHttpRequest request = exchange.getRequest(); if (request.getMethod() != HttpMethod.POST) { return setUnauthorizedResponse(exchange, "This req is only support :" + request.getMethod()); } return DataBufferUtils.join(exchange.getRequest().getBody()).flatMap(dataBuffer -> { byte[] bytes = new byte[dataBuffer.readableByteCount()]; dataBuffer.read(bytes); try { String bodyString = new String(bytes, "utf-8"); log.info(bodyString); exchange.getAttributes().put("POST_BODY", bodyString); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } DataBufferUtils.release(dataBuffer); Flux<DataBuffer> cachedFlux = Flux.defer(() -> { DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(bytes); return Mono.just(buffer); }); ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator(exchange.getRequest()) { @Override public Flux<DataBuffer> getBody() { return cachedFlux; } }; // String reqBody = (String)exchange.getAttributes().get("POST_BODY"); // log.info("===> reqBody:{}", reqBody); ServerWebExchange mutableExchange = exchange.mutate().request(mutatedRequest).build(); return chain.filter(mutableExchange); }); } @Override public int getOrder() { return -200; } }