diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/GatewayContext.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/ServerWebExchangeUtil.java similarity index 52% rename from sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/GatewayContext.java rename to sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/ServerWebExchangeUtil.java index 8b7e2d2c..9433e06a 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/GatewayContext.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/ServerWebExchangeUtil.java @@ -1,16 +1,21 @@ package com.gitee.sop.gatewaycommon.gateway; -import com.gitee.sop.gatewaycommon.bean.ApiContext; +import com.alibaba.fastjson.JSON; import com.gitee.sop.gatewaycommon.bean.SopConstants; import com.gitee.sop.gatewaycommon.param.ApiParam; import com.gitee.sop.gatewaycommon.util.RequestUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.util.MultiValueMap; import org.springframework.web.server.ServerWebExchange; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Consumer; import static com.gitee.sop.gatewaycommon.bean.SopConstants.CACHE_REQUEST_BODY_FOR_MAP; import static com.gitee.sop.gatewaycommon.bean.SopConstants.CACHE_REQUEST_BODY_OBJECT_KEY; @@ -18,12 +23,12 @@ import static com.gitee.sop.gatewaycommon.bean.SopConstants.CACHE_REQUEST_BODY_O /** * @author tanghc */ -public class GatewayContext extends ApiContext { +public class ServerWebExchangeUtil { /** * 获取请求参数 - * @param exchange - * @return + * @param exchange ServerWebExchange + * @return 返回请求参数 */ public static ApiParam getApiParam(ServerWebExchange exchange) { return exchange.getAttribute(SopConstants.CACHE_API_PARAM); @@ -31,8 +36,8 @@ public class GatewayContext extends ApiContext { /** * 设置请求参数 - * @param exchange - * @param apiParam + * @param exchange ServerWebExchange + * @param apiParam 请求参数 */ public static void setApiParam(ServerWebExchange exchange, ApiParam apiParam) { exchange.getAttributes().put(SopConstants.CACHE_API_PARAM, apiParam); @@ -40,12 +45,12 @@ public class GatewayContext extends ApiContext { /** * 获取Spring Cloud Gateway请求的原始参数。前提是要使用ReadBodyRoutePredicateFactory - * @param exchange + * @param exchange ServerWebExchange * @return 没有参数返回null * @see com.gitee.sop.gatewaycommon.gateway.route.ReadBodyRoutePredicateFactory */ - public static Map getRequestParams(ServerWebExchange exchange) { - Map params = exchange.getAttribute(CACHE_REQUEST_BODY_FOR_MAP); + public static Map getRequestParams(ServerWebExchange exchange) { + Map params = exchange.getAttribute(CACHE_REQUEST_BODY_FOR_MAP); if (params != null) { return params; } @@ -55,7 +60,14 @@ public class GatewayContext extends ApiContext { } else { String cachedBody = exchange.getAttribute(CACHE_REQUEST_BODY_OBJECT_KEY); if (cachedBody != null) { - params = RequestUtil.parseQueryToMap(cachedBody); + MediaType contentType = exchange.getRequest().getHeaders().getContentType(); + // 如果是json方式提交 + if (contentType != null + && StringUtils.containsAny(contentType.toString().toLowerCase(), "json", "text")) { + params = JSON.parseObject(cachedBody); + } else { + params = RequestUtil.parseQueryToMap(cachedBody); + } } } if (params != null) { @@ -64,15 +76,33 @@ public class GatewayContext extends ApiContext { return params; } - private static Map buildParams(MultiValueMap queryParams) { + public static Map buildParams(MultiValueMap queryParams) { if (queryParams == null || queryParams.size() == 0) { return null; } Map params = new HashMap<>(queryParams.size()); for (Map.Entry> entry : queryParams.entrySet()) { - String val = entry.getValue().get(0); - params.put(entry.getKey(), val); + params.put(entry.getKey(), entry.getValue().get(0)); } return params; } + + /** + * 添加header + * @param exchange 当前ServerWebExchange + * @param headersConsumer headers + * @return 返回一个新的ServerWebExchange + */ + public static ServerWebExchange addHeaders(ServerWebExchange exchange, Consumer headersConsumer) { + // 创建一个新的request + ServerHttpRequest serverHttpRequestNew = exchange.getRequest() + .mutate() + .headers(headersConsumer) + .build(); + // 将现在的request 变成 change对象 + return exchange + .mutate() + .request(serverHttpRequestNew) + .build(); + } } diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/filter/LimitFilter.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/filter/LimitFilter.java index ae7573c4..872df6d1 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/filter/LimitFilter.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/filter/LimitFilter.java @@ -3,7 +3,7 @@ package com.gitee.sop.gatewaycommon.gateway.filter; import com.gitee.sop.gatewaycommon.bean.ApiConfig; import com.gitee.sop.gatewaycommon.bean.ConfigLimitDto; import com.gitee.sop.gatewaycommon.exception.ApiException; -import com.gitee.sop.gatewaycommon.gateway.GatewayContext; +import com.gitee.sop.gatewaycommon.gateway.ServerWebExchangeUtil; import com.gitee.sop.gatewaycommon.limit.LimitManager; import com.gitee.sop.gatewaycommon.limit.LimitType; import com.gitee.sop.gatewaycommon.manager.LimitConfigManager; @@ -34,7 +34,7 @@ public class LimitFilter implements GlobalFilter, Ordered { if (!apiConfig.isOpenLimit()) { return chain.filter(exchange); } - ApiParam apiParam = GatewayContext.getApiParam(exchange); + ApiParam apiParam = ServerWebExchangeUtil.getApiParam(exchange); ConfigLimitDto configLimitDto = this.findConfigLimitDto(apiConfig, apiParam, exchange); if (configLimitDto == null) { return null; diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/filter/ValidateFilter.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/filter/ValidateFilter.java index 66e3e928..26d7de87 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/filter/ValidateFilter.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/filter/ValidateFilter.java @@ -1,9 +1,10 @@ package com.gitee.sop.gatewaycommon.gateway.filter; import com.gitee.sop.gatewaycommon.exception.ApiException; -import com.gitee.sop.gatewaycommon.gateway.GatewayContext; +import com.gitee.sop.gatewaycommon.gateway.ServerWebExchangeUtil; import com.gitee.sop.gatewaycommon.param.ApiParam; import com.gitee.sop.gatewaycommon.param.ParamBuilder; +import com.gitee.sop.gatewaycommon.param.ParamNames; import com.gitee.sop.gatewaycommon.validate.Validator; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -29,7 +30,7 @@ public class ValidateFilter implements GlobalFilter, Ordered { public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 解析参数 ApiParam param = paramBuilder.build(exchange); - GatewayContext.setApiParam(exchange, param); + ServerWebExchangeUtil.setApiParam(exchange, param); // 验证操作,这里有负责验证签名参数 try { validator.validate(param); @@ -37,7 +38,10 @@ public class ValidateFilter implements GlobalFilter, Ordered { log.error("验证失败,params:{}", param.toJSONString(), e); throw e; } - return chain.filter(exchange); + ServerWebExchange serverWebExchangeNew = ServerWebExchangeUtil.addHeaders(exchange, httpHeaders -> { + httpHeaders.add(ParamNames.HEADER_VERSION_NAME, param.fetchVersion()); + }); + return chain.filter(serverWebExchangeNew); } @Override diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/param/GatewayParamBuilder.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/param/GatewayParamBuilder.java index 0275371c..ed942fb7 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/param/GatewayParamBuilder.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/param/GatewayParamBuilder.java @@ -1,6 +1,6 @@ package com.gitee.sop.gatewaycommon.gateway.param; -import com.gitee.sop.gatewaycommon.gateway.GatewayContext; +import com.gitee.sop.gatewaycommon.gateway.ServerWebExchangeUtil; import com.gitee.sop.gatewaycommon.param.BaseParamBuilder; import org.springframework.web.server.ServerWebExchange; @@ -13,8 +13,8 @@ import java.util.Map; public class GatewayParamBuilder extends BaseParamBuilder { @Override - public Map buildRequestParams(ServerWebExchange exchange) { - Map params = GatewayContext.getRequestParams(exchange); + public Map buildRequestParams(ServerWebExchange exchange) { + Map params = ServerWebExchangeUtil.getRequestParams(exchange); return params == null ? Collections.emptyMap() : params; } @@ -24,6 +24,6 @@ public class GatewayParamBuilder extends BaseParamBuilder { } @Override - public void setVersionInHeader(ServerWebExchange ctx, String headerName, String version) { + public void setVersionInHeader(ServerWebExchange exchange, String headerName, String version) { } } diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/route/NameVersionRoutePredicateFactory.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/route/NameVersionRoutePredicateFactory.java index 10ffb40e..d5d91570 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/route/NameVersionRoutePredicateFactory.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/route/NameVersionRoutePredicateFactory.java @@ -1,7 +1,6 @@ package com.gitee.sop.gatewaycommon.gateway.route; -import com.gitee.sop.gatewaycommon.bean.SopConstants; -import com.gitee.sop.gatewaycommon.gateway.GatewayContext; +import com.gitee.sop.gatewaycommon.gateway.ServerWebExchangeUtil; import com.gitee.sop.gatewaycommon.param.ParamNames; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory; @@ -45,14 +44,17 @@ public class NameVersionRoutePredicateFactory extends AbstractRoutePredicateFact public Predicate apply(Config config) { return exchange -> { - Map params = GatewayContext.getRequestParams(exchange); + Map params = ServerWebExchangeUtil.getRequestParams(exchange); if (CollectionUtils.isEmpty(params)) { return false; } String nameVersion = config.param; - String name = params.getOrDefault(ParamNames.API_NAME, SopConstants.UNKNOWN_METHOD); - String version = params.getOrDefault(ParamNames.VERSION_NAME, ""); - return (name + version).equals(nameVersion); + Object name = params.get(ParamNames.API_NAME); + Object version = params.get(ParamNames.VERSION_NAME); + if (name == null || version == null) { + return false; + } + return (name.toString() + version.toString()).equals(nameVersion); }; }