解决springcloud的gateway中获取不到Post请求传入参数问题

解决springcloud的gateway中获取不到Post请求传入参数问题

解决gateway中获取不到post请求传入参数问题

由于最近的项目,用到了springboot+springcloud,需要在网关中做些参数的认证和限制,但是在开发中遇到获取不到post请求传入参数的问题,在网上搜索了半天也没能解决,最终还是靠着谷歌在外网搜索了半天最终解决了问题,希望这个帖子能够帮助跟我遇到同样问题的朋友。

造成这个问题的所在其实还是在于官方并不希望我们在网关中这样去操作,而是希望网关就做它应该做的事情。话不多说,直接上核心代码,第一次写帖子,请见谅。
@Component
public class ValidateFilter implements GlobalFilter, Ordered {

public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    System.out.println("-----------------全局过滤器MyGlobalFilter---------------------");
    System.out.println("-----------------请求方式---------------------");
	ServerRequest serverRequest = new DefaultServerRequest(exchange);
	// mediaType
	MediaType mediaType = exchange.getRequest().getHeaders().getContentType();
	String method = exchange.getRequest().getMethodValue();
    // read & modify body
    if ("POST".equals(method)) {

    Mono<String> modifiedBody = serverRequest.bodyToMono(String.class).flatMap(body -> {
        if (MediaType.APPLICATION_FORM_URLENCODED.isCompatibleWith(mediaType)) {
            // origin body map
          //这是你post请求获取到的参数
            Map<String, Object> bodyMap = decodeBody(body);
              //这里做你的业务操作
             
                
            // new body map
            Map<String, Object> newBodyMap = new HashMap<>();
			//重新放回
            return Mono.just(encodeBody(newBodyMap));
        }
        return Mono.empty();
    });

	BodyInserter bodyInserter = BodyInserters.fromPublisher(modifiedBody, String.class);
	HttpHeaders headers = new HttpHeaders();
	headers.putAll(exchange.getRequest().getHeaders());

	// the new content type will be computed by bodyInserter
	// and then set in the request decorator
	headers.remove(HttpHeaders.CONTENT_LENGTH);

	CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, headers);
	return bodyInserter.insert(outputMessage, new BodyInserterContext()).then(Mono.defer(() -> {
		ServerHttpRequestDecorator decorator = new ServerHttpRequestDecorator(exchange.getRequest()) {

			public HttpHeaders getHeaders() {
				long contentLength = headers.getContentLength();
				HttpHeaders httpHeaders = new HttpHeaders();
				httpHeaders.putAll(super.getHeaders());
				if (contentLength > 0) {
					httpHeaders.setContentLength(contentLength);
				} else {
					httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked");
				}
				return httpHeaders;
			}

			public Flux<DataBuffer> getBody() {
				return outputMessage.getBody();
			}
		};
		return chain.filter(exchange.mutate().request(decorator).build());
	}));
	}else if ("GET".equals(method)) {
        Map requestQueryParams = exchange.getRequest().getQueryParams();
        //TODO 得到Get请求的请求参数后,做你想做的事

        return chain.filter(exchange);
	}
    return chain.filter(exchange);
}


private Map<String, Object> decodeBody(String body) {
	return Arrays.stream(body.split("&")).map(s -> s.split("="))
			.collect(Collectors.toMap(arr -> arr[0], arr -> arr[1]));
}

private String encodeBody(Map<String, Object> map) {
	return map.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue()).collect(Collectors.joining("&"));
}

@Override
public int getOrder() {
	return Ordered.HIGHEST_PRECEDENCE;
}

}

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要在Spring Cloud Gateway添加POST请求参数,你需要使用Spring Cloud Gateway的过滤器。下面是一个示例: ```java @Component public class AddParameterGatewayFilterFactory extends AbstractGatewayFilterFactory<AddParameterGatewayFilterFactory.Config> { public AddParameterGatewayFilterFactory() { super(Config.class); } @Override public GatewayFilter apply(Config config) { return (exchange, chain) -> { ServerHttpRequest request = exchange.getRequest().mutate(). header(config.getHeaderName(), config.getHeaderValue()).build(); return chain.filter(exchange.mutate().request(request).build()); }; } public static class Config { private String headerName; private String headerValue; public String getHeaderName() { return headerName; } public void setHeaderName(String headerName) { this.headerName = headerName; } public String getHeaderValue() { return headerValue; } public void setHeaderValue(String headerValue) { this.headerValue = headerValue; } } } ``` 在这个示例,我们创建了一个过滤器工厂类 `AddParameterGatewayFilterFactory` 以添加POST请求参数。该过滤器将添加一个名为 `headerName` 的HTTP头和值为 `headerValue` 的HTTP头,这两个参数可以从配置文件或其他地方加载。 要使用此过滤器,请将以下内容添加到Spring Cloud Gateway的配置文件: ```yaml spring: cloud: gateway: routes: - id: add_parameter_route uri: http://example.com predicates: - Path=/example/** filters: - AddParameter=headerName=foo,headerValue=bar ``` 在这个示例,我们定义了一个名为 `add_parameter_route` 的路由,它将匹配所有以 `/example/` 开头的路径,并将其转发到 `http://example.com`。我们还将 `AddParameter` 过滤器添加到此路由,并将 `headerName` 设置为 `foo`,`headerValue` 设置为 `bar`。 现在,当客户端向Spring Cloud Gateway发送POST请求时,将自动添加 `foo: bar` HTTP头。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值