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
相关产品推荐
相关产品推荐

