You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 14:46:07