如何让Java11+ HttpClient在重定向时移除Authorization头?
解决Java HttpClient重定向到S3预签名URL时的授权头冲突问题
问题根源在于Java HttpClient默认的重定向策略会保留原请求的Authorization头,但S3预签名URL已经通过查询参数包含了授权信息,不允许同时存在两种授权机制,所以必须在重定向时移除这个头。
你可以通过自定义重定向处理器实现需求,具体操作如下:
- 实现
HttpClient.RedirectHandler接口,在处理重定向时复制原请求并移除Authorization头 - 构建HttpClient时指定这个自定义处理器,替代默认的
followRedirects(Redirect.NORMAL)
完整代码示例
import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.URI; import java.util.Optional; public class S3RedirectClient { public static void main(String[] args) throws Exception { // 自定义重定向处理器 HttpClient.RedirectHandler redirectHandler = new HttpClient.RedirectHandler() { @Override public Optional<HttpRequest> followRedirect(HttpRequest initialRequest, HttpResponse<?> response, URI newUri) { // 复制原请求并过滤掉Authorization头 HttpRequest redirectedRequest = initialRequest.newBuilder() .uri(newUri) .headers(initialRequest.headers().map().entrySet().stream() .filter(entry -> !entry.getKey().equalsIgnoreCase("Authorization")) .flatMap(entry -> entry.getValue().stream().map(v -> new String[]{entry.getKey(), v})) .toArray(String[][]::new)) .build(); return Optional.of(redirectedRequest); } }; // 构建HttpClient,使用自定义重定向处理器 HttpClient client = HttpClient.newBuilder() .redirectHandler(redirectHandler) .build(); // 构造初始请求,携带Authorization头 HttpRequest initialRequest = HttpRequest.newBuilder() .uri(URI.create("你的目标API地址")) .header("Authorization", "Bearer 你的授权token") .GET() .build(); // 发送请求并获取响应 HttpResponse<String> response = client.send(initialRequest, HttpResponse.BodyHandlers.ofString()); System.out.println("响应状态码:" + response.statusCode()); System.out.println("响应内容:" + response.body()); } }
关键说明
- 代码中通过过滤请求头的方式彻底移除
Authorization,比直接设空值更可靠 - 自定义
RedirectHandler会完全替代默认重定向逻辑,因此不需要再调用followRedirects()方法 - 该实现和curl默认行为一致:重定向到不同域名时自动移除敏感的授权头
内容的提问来源于stack exchange,提问作者Rebecca R
相关产品推荐
相关产品推荐

