如何配置Spring WebClient跟随重定向并持续传递访问令牌/授权头
问题根因
Reactor Netty 默认的自动跟随重定向策略出于安全考虑,不会将原始请求中的
Authorization请求头透传到重定向后的目标地址,因此仅开启followRedirect(true)配置的情况下,重定向请求会因缺少访问令牌返回401错误。
修复配置
你需要自定义重定向处理逻辑,手动透传Authorization头到重定向请求中,完整WebClient配置示例如下:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpHeaders; import org.springframework.http.client.reactive.ReactorClientHttpConnector; import org.springframework.web.reactive.function.client.WebClient; import reactor.netty.http.client.HttpClient; @Configuration public class WebClientConfig { @Bean public WebClient redirectSupportedWebClient() { HttpClient httpClient = HttpClient.create() .followRedirect(true, (originalRequest, redirectResponse) -> // 重定向请求构造时透传原始请求的Authorization头 (redirectReq, res) -> { String authHeader = originalRequest.requestHeaders().get(HttpHeaders.AUTHORIZATION); if (authHeader != null) { redirectReq.requestHeaders().set(HttpHeaders.AUTHORIZATION, authHeader); } return redirectReq; } ); return WebClient.builder() .clientConnector(new ReactorClientHttpConnector(httpClient)) // 若使用Spring Security OAuth2 Client自动管理client credentials令牌,需添加对应过滤器自动注入令牌 // .filter(ServerOAuth2AuthorizedClientExchangeFilterFunction.clientCredentials()) .build(); } }
注意事项
- 上述配置默认会在所有重定向请求中携带访问令牌,若需避免令牌跨域泄露,可以增加逻辑判断原始请求域名和重定向目标域名是否一致,仅同域名时才透传
Authorization头。 - 若你手动在每次请求时添加
Authorization头,该配置会自动透传;如果是通过OAuth2客户端自动管理令牌,只需要补充注释中的过滤器配置即可,无需手动处理令牌注入。
内容的提问来源于stack exchange,提问作者Life long learner
相关产品推荐
相关产品推荐

