Spring Cloud Gateway 2添加认证信息Header后无响应问题求助
问题分析与修复方案
嘿,你遇到的这个问题确实是Reactor异步流的使用姿势不对,核心问题是没有正确传递网关请求处理的Mono流,导致请求链中途“断了”,所以只会返回200状态码但没有实际响应内容。
你的代码里的几个问题:
- 你用
exchange.getPrincipal().map(...)来处理请求Builder,但map只是做同步转换,没有衔接后续的异步请求处理; doOnSuccess是个副作用操作,它不会改变流的走向,你在里面调用的chain.filter(...)根本没被正确执行;- 最后调用的
then()会丢弃前面所有流的结果,返回一个空的完成信号,网关自然没法继续处理响应。
修正后的完整代码:
public class UserInfoFilter implements GlobalFilter, Ordered { @Override public int getOrder() { return Ordered.HIGHEST_PRECEDENCE; } @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { return exchange.getPrincipal() // 处理用户信息,转换出修改后的请求(或原请求) .map(principal -> { if (principal instanceof Authentication auth) { if (auth.getPrincipal() instanceof UserDetails user) { // 添加用户头到请求 return exchange.getRequest().mutate() .header("userName", user.getUsername()) .build(); } } // 没有用户信息就返回原请求 return exchange.getRequest(); }) // 处理未登录/无用户信息的场景,避免流中断 .defaultIfEmpty(exchange.getRequest()) // 把修改后的请求传递给下一个过滤器链,返回正确的Mono流 .flatMap(modifiedRequest -> { ServerWebExchange modifiedExchange = exchange.mutate() .request(modifiedRequest) .build(); return chain.filter(modifiedExchange); }); } }
为什么这样改:
- 直接在
map里生成修改后的请求对象,避免单独持有Builder导致的状态问题; defaultIfEmpty保证即使没有用户信息,请求链也能继续走下去;- 用
flatMap来订阅并返回chain.filter(...)的结果,让网关能正确处理整个请求-响应流,而不是中途终止。
这样调整后,用户信息会被正确添加到请求头,请求也能正常转发到后端,响应内容也能正常返回了。
内容的提问来源于stack exchange,提问作者zjengjie
相关产品推荐
相关产品推荐

