当前位置:首页 >> 智能终端演进 >> 【SpringCloud】Gateway 配置全局过滤器获取请求参数和响应值,联想天逸f30

【SpringCloud】Gateway 配置全局过滤器获取请求参数和响应值,联想天逸f30

cpugpu芯片开发光刻机 智能终端演进 1
文件名:【SpringCloud】Gateway 配置全局过滤器获取请求参数和响应值,联想天逸f30 【SpringCloud】Gateway 配置全局过滤器获取请求参数和响应值 【SpringCloud】Gateway 配置全局过滤器获取请求参数和响应值

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

1. 获取请求参数RequestBody @Component@Slf4j@AllArgsConstructorpublic class HttpRequestFilter implements GlobalFilter, Ordered {@Overridepublic 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()) {@Overridepublic Flux<DataBuffer> getBody() {return cachedFlux;}};return chain.filter(exchange.mutate().request(mutatedRequest).build());});}return chain.filter(exchange);}@Overridepublic int getOrder() {return -200;}} 获取请求响应值ResponseBody

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

@Slf4j@Componentpublic class HttpResponseFilter implements GlobalFilter, Ordered {@Overridepublic 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) {@Overridepublic 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());}@Overridepublic int getOrder() {return -200;}}

参考资料:https://www.jianshu.com/p/7890a4f89229?ivk_sa=1024320u

协助本站SEO优化一下,谢谢!
关键词不能为空
同类推荐
«    2025年12月    »
1234567
891011121314
15161718192021
22232425262728
293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接