背景介绍
项目使用的技术栈是Spring Cloud,有个功能需求是:
业务上,在Spring Cloud Gateway模块的服务已经可以获取到token,并且已实现鉴权通过后从token获取到身份信息;
现在希望把身份信息,填充到request参数里面(这里把多个数据封装成一个BaseDTO
对象,用于扩展)。
后续处理具体业务的微服务模块,在controller层的方法传参,只要继承了BaseDTO
对象,就可以直接获取到身份信息,用于业务逻辑处理。
问题描述
简单来说,问题就是 Spring Cloud Gateway 如何动态添加请求参数。
Spring Cloud Gateway Add Request Parameter
- 查看官方文档,提供了下面的示例:
但是是在配置文件写明的,看起来好像只能是固定值。
- 在github上看到也有人提了类似问题,
但是实现的效果也跟配置文件差不多。
- 在stackoverflow上也查了类似回答:
stackoverflow.com/questions/6…
大概思路有了方向。
解决方案
在 Spring Cloud Gateway 源码上,发现了这两个类 AddRequestParameterGatewayFilterFactory
和 ModifyRequestBodyGatewayFilterFactory
代码内容如下:
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 n