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

Java网页抓取:使用getInputStream()遇重定向与变音符号问题求助

解决重定向循环(含变音符号URL)问题

出现Server redirected too many times (20)是因为默认的URLConnection在处理带变音符号的重定向URL时,编码处理不当,导致每次重定向都无法正确匹配目标地址,陷入循环。以下是几种可行的解决办法:

1. 手动接管重定向流程

禁用自动重定向,自己解析重定向地址并处理编码:

URL url = new URL("https://website.com/lang/npc=" + id);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
// 禁用自动重定向
con.setInstanceFollowRedirects(false);

int status = con.getResponseCode();
// 循环处理3xx重定向
while (status >= 300 && status < 400) {
    String location = con.getHeaderField("Location");
    // 解码重定向地址,还原变音符号
    location = URLDecoder.decode(location, "UTF-8");
    // 基于原URL的协议和主机,构造合法的重定向URL
    URL redirectUrl = new URL(new URL(url.getProtocol() + "://" + url.getHost()), location);
    con.disconnect();
    con = (HttpURLConnection) redirectUrl.openConnection();
    con.setInstanceFollowRedirects(false);
    status = con.getResponseCode();
}

// 获取最终目标地址的输入流
InputStream inputStream = con.getInputStream();

2. 确保URL编码合规

构造或处理URL时,对含特殊字符的部分做正确编码(注意仅编码路径/参数部分,不要编码整个URL):

// 示例:处理带变音符号的路径
String rawPath = "/lang/npc=6/koboldgezücht";
// 编码特殊字符,同时保留URL必要的斜杠
String encodedPath = URLEncoder.encode(rawPath, "UTF-8")
        .replace("+", "%20") // 替换空格的编码格式,符合URL规范
        .replace("%2F", "/"); // 保留路径斜杠不编码
URL correctUrl = new URL("https://website.com" + encodedPath);

3. 改用Java 11+ HttpClient(推荐)

Java 11引入的HttpClient对重定向和特殊字符的处理更成熟,无需手动编码即可自动处理:

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://website.com/lang/npc=" + id))
        .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
// 直接获取最终响应内容
String content = response.body();

内容的提问来源于stack exchange,提问作者Garog

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:21:02