一、该问题的重现步骤是什么?
因为业务关系需要使用gateway来引入外部的业务接口(非BladeX),所以想在gateway里面直接增加路由。
但目前 org.springblade.gateway.filter.RequestFilter 类中默认移除了Url的第一级参数,例如:
http://www.baidu.com/a/b?code=xxx
变成了
http://www.baidu.com/b?code=xxx
二、你期待的结果是什么?实际看到的又是什么?
对于这个URL重写规则是不是应该有个范围,例如 /api/xx 的路径包含了api 的才进行重写规则呢?
三、你正在使用的是什么产品,什么版本?在什么操作系统上?
Bladex 4.1.0
因为网关第一层会去nacos请求服务名,以服务名为前缀放到接口地址进行调用。而第一层的服务名是不实际存在于controller的,所以需要把它移除。并且用户自定义的服务名各种可能都有,无法做到精准识别,既然是用了blade体系,那第一层就是服务名必须移除。不同场景不同需求,目前我们还是会保持原样。
如果不满足你们的场景可自定义逻辑,比如加前缀判断。
@Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); String rawPath = request.getURI().getRawPath(); // 定义需要跳过的前缀列表 List<String> skipPrefixes = Arrays.asList("/blade", "/api"); // 检查原始路径是否以指定的前缀开始 boolean shouldSkip = skipPrefixes.stream().anyMatch(rawPath::startsWith); // 如果路径以指定前缀开始,则跳过第一个路径段 String newPath; if (shouldSkip) { newPath = "/" + Arrays.stream(StringUtils.tokenizeToStringArray(rawPath, "/")) .skip(1L) .collect(Collectors.joining("/")); } else { // 如果不以指定前缀开始,保留原始路径 newPath = rawPath; } // 创建新的请求对象并更新路径 ServerHttpRequest newRequest = request.mutate() .path(newPath) .build(); // 更新交换的请求对象 return chain.filter(exchange.mutate().request(newRequest).build()); }
讨论(0)
-
了解,那就自己重写它吧!
讨论(0)
官方新品
- 热议问题
-
强制有些sql查主库
1
-
报文加密后端加密后传给前端,前端解密发现long类型的数据精度丢失
1
-
iot后台通过feign调用不到服务
1
-
variables.scss的@use引入冲突
1
-
cloud版本远程调用提示file文件名不存在
1
-
BladeX-biz 新建module后,启动报错:Failed to determine suitable jdbc url
1
-
powerjob执行任务状态是等待Worker接收,如何解决通讯问题
1
-
框架4.4.0版本的,现有的功能有支持直接获取远程调用抛出的异常提示吗?
1
-
bladex自定义认证模块
2
-
fegin 远程调用如何传递 BladeUser 到远程?
1
扫一扫访问 Blade技术社区 移动端