Spring cloud gateway 修改请求头、修改请求报文和参数校验等网关功能

本文介绍了在Spring Cloud Gateway中如何实现请求格式校验、请求头修改以及请求体的修改,包括增加traceId进行日志追踪,并详细阐述了构建过程和功能实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在公司构建一个项目,统一建一套网关,现将网关的功能和构建过程介绍如下。

网关功能

1、校验请求格式
2、验证参数签名权限,修改请求头信息
3、修改请求体,增加traceId(便于日志追踪)

构建过程

使用spring-cloud-gateway 3.0.3包,集成到spring-boot 2.5.2

1、校验请求格式

@Component
public class RequestFilter implements GlobalFilter, Ordered {
   

	@Override
	public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
   
		ServerHttpRequest request = exchange.getRequest();
		addOriginalRequestUrl(exchange, request.getURI());
		String rawPath = request.getURI().getRawPath();
		String newPath = "/" + Arrays.stream(StringUtils.tokenizeToStringArray(rawPath, "/"))
			.skip(1L).collect(Collectors.joining("/"));
		ServerHttpRequest newRequest = request.mutate()
			.path(newPath)
			.build();
		exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, newRequest.getURI());
		return chain.filter(exchange.mutate().request(newRequest.mutate().build()).build());
	}

	@Override
	public int getOrder() {
   
		return -1000; // 执行顺序,必须为负数,值越小执行顺序越靠前
	}

}

2、验证参数签名权限,修改请求头信息

@Slf4j
@Component
@AllArgsConstructor
public class AuthFilter implements GlobalFilter, Ordered {
   
	private final AuthProperties authProperties;
	private final ObjectMapper objectMapper;
	private final AntPathMatcher antPathMatcher = new AntPathMatcher();

	private RedisUtil redisUtil;

	@Override
	public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
   
		String path = exchange.getRequest().getURI().getPath();
		if (FilterUtil.isSkip(path,authProperties,antPathMatcher)) {
   
			return chain.filter(exchange);
		}
		ServerHttpRequest req = exchange.getRequest();
		ServerHttpResponse res = exchange.getResponse();
		
### 解决 NacosException 错误及 Spring Cloud Gateway 配置问题 当遇到 `com.alibaba.nacos.api.exception.NacosException: failed to req API:/nacos/v1/ns/instance` 类似的错误时,通常表明客户端无法成功连接到 Nacos Server 或者存在权限不足等问题。以下是针对此问题的具体分析解决方案。 --- #### 一、Nacos 连接失败的原因排查 ##### 1. **Nacos Server 是否正常运行** 确认本地或远程的 Nacos Server 已经启动,并监听默认端口 `8848`。可以通过访问 URL 地址来验证服务器状态: ```bash curl http://localhost:8848/nacos/v1/ns/health ``` 如果返回 JSON 数据表示健康状况良好,则说明服务可用;反之则需检查日志定位具体原因[^2]。 ##### 2. **网络连通性测试** 执行如下命令检测是否存在网络阻塞情况: ```bash telnet localhost 8848 ``` 若提示 “Connection refused”,可能是由于防火墙规则阻止了通信或者是目标主机未开启对应的服务进程所致[^2]。 ##### 3. **用户名密码校验** 从报文中提到的状态码 `403 Forbidden Unknown User` 可知当前尝试登录的操作被拒绝,因为缺少有效的认证凭证。需要确保应用程序配置文件中指定了正确的账号信息: ```yaml spring: cloud: nacos: discovery: username: nacos password: nacos ``` 注意:这里的账户名与密码应匹配安装实例所设定的内容,默认值即为 `"nacos"`[^3]。 --- #### 二、Spring Cloud Gateway 的基本配置流程 为了使 Spring Cloud Gateway 能够顺利集成至基于 Nacos 实现的服务发现体系当中,下面列举了一些必要的参数调整事项。 ##### 1. 添加 Maven 依赖项 确保项目的 POM 文件包含了最新稳定版的支持库组合: ```xml <!-- Nacos Discovery Starter --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2021.1</version> </dependency> <!-- Config Center Integration --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2021.1</version> </dependency> <!-- Core Component For Routing Logic --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> ``` 此处版本号可以根据实际环境选用合适的分支标签[^3]。 ##### 2. 修改 bootstrap.yml/yaml 设置 为了让网关识别外部资源位置并加载相应的元数据记录,必须指定清晰的数据源路径以及集群节点清单: ```yaml spring: application: name: my-gateway-service cloud: gateway: routes: - id: example-route uri: lb://example-provider-service predicates: - Path=/api/example/** nacos: config: server-addr: 127.0.0.1:8848 file-extension: yaml discovery: server-addr: ${spring.cloud.nacos.config.server-addr} namespace: dev-env # Optional field depending on your setup. server: port: 9090 management: endpoints: web: exposure: include: "*" ``` 上述样例定义了一条静态映射关系,允许任何符合 `/api/example/**` 模式的 HTTP 请求转发给名为 `example-provider-service` 的上游模块处理[^5]。 --- #### 三、常见注意事项 - 如果仍然遭遇类似的异常现象,请仔细核对各个组件间的兼容性列表,避免因混搭不同大版本而导致冲突发生。 - 对于生产环境下部署建议启用 SSL/TLS 加密保护敏感交互过程免受中间人攻击威胁影响[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值