From ada28231bd49ef0fadf57dc2e9d2d26f0e6158fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90li?= <15040126243@163.com> Date: Mon, 30 May 2022 20:59:50 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E5=A2=9E=E5=8A=A0=20gateway=20=E5=85=A8?= =?UTF-8?q?=E5=B1=80=E7=BC=93=E5=AD=98=E8=BF=87=E6=BB=A4=E5=99=A8=20?= =?UTF-8?q?=E8=A7=A3=E5=86=B3body=E4=B8=8D=E8=83=BD=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E8=AF=BB=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/dev/ruoyi-gateway.yml | 1 - .../gateway/filter/CacheRequestFilter.java | 91 ------------------- .../filter/GlobalCacheRequestFilter.java | 39 ++++++++ 3 files changed, 39 insertions(+), 92 deletions(-) delete mode 100644 ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/CacheRequestFilter.java create mode 100644 ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/GlobalCacheRequestFilter.java diff --git a/config/dev/ruoyi-gateway.yml b/config/dev/ruoyi-gateway.yml index 5f0f5b6d..deb3fe97 100644 --- a/config/dev/ruoyi-gateway.yml +++ b/config/dev/ruoyi-gateway.yml @@ -46,7 +46,6 @@ spring: - Path=/auth/** filters: # 验证码处理 - - CacheRequestFilter - ValidateCodeFilter - StripPrefix=1 # 代码生成 diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/CacheRequestFilter.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/CacheRequestFilter.java deleted file mode 100644 index a989e324..00000000 --- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/CacheRequestFilter.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.ruoyi.gateway.filter; - -import org.springframework.cloud.gateway.filter.GatewayFilter; -import org.springframework.cloud.gateway.filter.GatewayFilterChain; -import org.springframework.cloud.gateway.filter.OrderedGatewayFilter; -import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; -import org.springframework.core.io.buffer.DataBuffer; -import org.springframework.core.io.buffer.DataBufferFactory; -import org.springframework.core.io.buffer.DataBufferUtils; -import org.springframework.http.HttpMethod; -import org.springframework.http.server.reactive.ServerHttpRequestDecorator; -import org.springframework.stereotype.Component; -import org.springframework.web.server.ServerWebExchange; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -import java.util.Collections; -import java.util.List; - -/** - * 获取body请求数据(解决流不能重复读取问题) - * - * @author ruoyi - */ -@Component -public class CacheRequestFilter extends AbstractGatewayFilterFactory { - public CacheRequestFilter() { - super(Config.class); - } - - @Override - public String name() { - return "CacheRequestFilter"; - } - - @Override - public GatewayFilter apply(Config config) { - CacheRequestGatewayFilter cacheRequestGatewayFilter = new CacheRequestGatewayFilter(); - Integer order = config.getOrder(); - if (order == null) { - return cacheRequestGatewayFilter; - } - return new OrderedGatewayFilter(cacheRequestGatewayFilter, order); - } - - public static class CacheRequestGatewayFilter implements GatewayFilter { - @Override - public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { - // GET DELETE 不过滤 - HttpMethod method = exchange.getRequest().getMethod(); - if (method == null || method.matches("GET") || method.matches("DELETE")) { - return chain.filter(exchange); - } - return DataBufferUtils.join(exchange.getRequest().getBody()).map(dataBuffer -> { - byte[] bytes = new byte[dataBuffer.readableByteCount()]; - dataBuffer.read(bytes); - DataBufferUtils.release(dataBuffer); - return bytes; - }).defaultIfEmpty(new byte[0]).flatMap(bytes -> { - DataBufferFactory dataBufferFactory = exchange.getResponse().bufferFactory(); - ServerHttpRequestDecorator decorator = new ServerHttpRequestDecorator(exchange.getRequest()) { - @Override - public Flux getBody() { - if (bytes.length > 0) { - return Flux.just(dataBufferFactory.wrap(bytes)); - } - return Flux.empty(); - } - }; - return chain.filter(exchange.mutate().request(decorator).build()); - }); - } - } - - @Override - public List shortcutFieldOrder() { - return Collections.singletonList("order"); - } - - static class Config { - private Integer order; - - public Integer getOrder() { - return order; - } - - public void setOrder(Integer order) { - this.order = order; - } - } -} \ No newline at end of file diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/GlobalCacheRequestFilter.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/GlobalCacheRequestFilter.java new file mode 100644 index 00000000..60f5af7c --- /dev/null +++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/GlobalCacheRequestFilter.java @@ -0,0 +1,39 @@ +package com.ruoyi.gateway.filter; + +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; +import org.springframework.core.Ordered; +import org.springframework.http.HttpMethod; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +/** + * 全局缓存获取body请求数据(解决流不能重复读取问题) + * + * @author Lion Li + */ +@Component +public class GlobalCacheRequestFilter implements GlobalFilter, Ordered { + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + // GET DELETE 不过滤 + HttpMethod method = exchange.getRequest().getMethod(); + if (method == null || method.matches("GET") || method.matches("DELETE")) { + return chain.filter(exchange); + } + return ServerWebExchangeUtils.cacheRequestBodyAndRequest(exchange, (serverHttpRequest) -> { + if (serverHttpRequest == exchange.getRequest()) { + return chain.filter(exchange); + } + return chain.filter(exchange.mutate().request(serverHttpRequest).build()); + }); + } + + @Override + public int getOrder() { + return 0; + } +}