Spring Cloud Gateway 如何动态添加请求参数

本文介绍了在Spring Cloud Gateway项目中如何动态添加请求参数,以满足身份信息传递的需求。通过分析官方文档、GitHub讨论和Stack Overflow问答,找到解决方案。利用`AddRequestParameterGatewayFilterFactory`和`ModifyRequestBodyGatewayFilterFactory`,实现鉴权过滤器,针对GET和POST请求,无论请求内容是application/json还是form data,都能成功添加参数。最终,身份信息会被添加到request参数中,方便业务处理微服务获取并使用。

背景介绍

项目使用的技术栈是Spring Cloud,有个功能需求是:

业务上,在Spring Cloud Gateway模块的服务已经可以获取到token,并且已实现鉴权通过后从token获取到身份信息;

现在希望把身份信息,填充到request参数里面(这里把多个数据封装成一个BaseDTO对象,用于扩展)。

后续处理具体业务的微服务模块,在controller层的方法传参,只要继承了BaseDTO对象,就可以直接获取到身份信息,用于业务逻辑处理。

问题描述

简单来说,问题就是 Spring Cloud Gateway 如何动态添加请求参数。

Spring Cloud Gateway Add Request Parameter

  1. 查看官方文档,提供了下面的示例:

docs.spring.io/spring-clou…

image.png

但是是在配置文件写明的,看起来好像只能是固定值。

  1. 在github上看到也有人提了类似问题,

github.com/spring-clou…

image.png

但是实现的效果也跟配置文件差不多。

  1. 在stackoverflow上也查了类似回答:

stackoverflow.com/questions/6…

image.png

大概思路有了方向。

解决方案

在 Spring Cloud Gateway 源码上,发现了这两个类 AddRequestParameterGatewayFilterFactoryModifyRequestBodyGatewayFilterFactory

image.png

代码内容如下:

AddRequestParameterGatewayFilterFactory

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.springframework.cloud.gateway.filter.factory;

import java.net.URI;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractNameValueGatewayFilterFactory.NameValueConfig;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.util.StringUtils;
import org.springframework.web.util.UriComponentsBuilder;

public class AddRequestParameterGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {
    public AddRequestParameterGatewayFilterFactory() {
    }

    public GatewayFilter apply(NameValueConfig config) {
        return (exchange, chain) -> {
            URI uri = exchange.getRequest().getURI();
            StringBuilder query = new StringBuilder();
            String originalQuery = uri.getRawQuery();
            if (StringUtils.hasText(originalQuery)) {
                query.append(originalQuery);
                if (originalQuery.charAt(originalQuery.length() - 1) != '&') {
                    query.append('&');
                }
            }

            query.append(config.getName());
            query.append('=');
            query.append(config.getValue());

            try {
                URI newUri = UriComponent
要在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头。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值