「SpringCloud」Gateway 配置全局过滤器获取请求参数和响应值

「SpringCloud」Gateway 配置全局过滤器获取请求参数和响应值Gateway 配置全局过滤器获取请求参数和响应值。Flux cachedFlux = Flux.defer;

大家好,欢迎来到IT知识分享网。

【SpringCloud】Gateway 配置全局过滤器获取请求参数和响应值

实现Ordered接口getOrder()方法,数值越小越靠前执行,记得这一点就OK了。

获取请求参数RequestBody

@Component @Slf4j @AllArgsConstructor public class HttpRequestFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); String method = request.getMethodValue(); String contentType = request.getHeaders().getFirst("Content-Type"); if ("POST".equals(method)) { 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; } }; return chain.filter(exchange.mutate().request(mutatedRequest) .build()); }); } return chain.filter(exchange); } @Override public int getOrder() { return -200; } }

获取请求响应值ResponseBody

POSTMAN工具请求里的gzip压缩头导致获取响应值一直乱码,解决gzip压缩后响应值获取

@Slf4j @Component public class HttpResponseFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); String path = request.getPath().toString(); ServerHttpResponse originalResponse = exchange.getResponse(); System.out.println(originalResponse.isCommitted()); DataBufferFactory bufferFactory = originalResponse.bufferFactory(); ServerHttpResponseDecorator decoratedResponse = 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.buffer().map(dataBuffer -> { DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory(); DataBuffer join = dataBufferFactory.join(dataBuffer); byte[] content = new byte[join.readableByteCount()]; join.read(content); //释放掉内存 DataBufferUtils.release(join); String s = new String(content, StandardCharsets.UTF_8); List<String> strings = exchange.getResponse().getHeaders().get(HttpHeaders.CONTENT_ENCODING); if (!CollectionUtils.isEmpty(strings) && strings.contains("gzip")) { GZIPInputStream gzipInputStream = null; try { gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(content), content.length); StringWriter writer = new StringWriter(); IOUtils.copy(gzipInputStream, writer, "UTF-8"); s = writer.toString(); } catch (IOException e) { log.error("====Gzip IO error", e); } finally { if (gzipInputStream != null) { try { gzipInputStream.close(); } catch (IOException e) { log.error("===Gzip IO close error", e); } } } } else { s = new String(content, StandardCharsets.UTF_8); } log.info("bodyString: {}", s);//打印请求响应值 return bufferFactory.wrap(content); })); } return super.writeWith(body); } }; return chain.filter(exchange.mutate().response(decoratedResponse).build()); } @Override public int getOrder() { return -200; } }

赵小胖个人博客:https://zc.happyloves.cn:4443/wordpress/

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/80435.html

(0)
上一篇 2024-08-27 19:15
下一篇 2024-08-28 18:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信