首次请求返回状态码200时如何使用Jsoup获取最终重定向URL
问题根源
你遇到的是前端侧跳转场景,包括meta refresh标签跳转、JavaScript动态跳转两类,这类跳转不属于HTTP协议定义的3xx重定向范畴,因此Jsoup默认的重定向跟随逻辑不会触发,会直接停在返回200状态码的首个空白页面。
实现方案
你需要在Jsoup默认的HTTP重定向处理基础上,额外增加前端跳转规则的识别逻辑,同时设置最大跳转次数避免死循环,完整实现代码如下:
import org.jsoup.Connection; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RedirectFetcher { // 最大跳转次数,防止死循环 private static final int MAX_REDIRECTS = 5; // 匹配JS中location跳转的正则,可根据实际场景扩展规则 private static final Pattern JS_REDIRECT_PATTERN = Pattern.compile("(window\\.)?location\\.(href|replace|assign)\\s*=\\s*['\"]([^'\"]+)['\"]", Pattern.CASE_INSENSITIVE); public static void main(String[] args) throws IOException { String initialUrl = "替换为你的初始redirectUrl"; String finalUrl = getFinalRedirectUrl(initialUrl); Document finalDoc = Jsoup.connect(finalUrl).timeout(5000).get(); String actualPageTitle = finalDoc.title(); System.out.println("Final URL: " + finalUrl); System.out.println("Actual Page Title: " + actualPageTitle); } private static String getFinalRedirectUrl(String initialUrl) throws IOException { String currentUrl = initialUrl; int redirectCount = 0; while (redirectCount < MAX_REDIRECTS) { Connection.Response response = Jsoup.connect(currentUrl) .followRedirects(true) // 开启默认3xx重定向跟随 .timeout(5000) .execute(); Document doc = response.parse(); currentUrl = response.url().toString(); // 1. 检查meta refresh跳转规则 Elements metaRefresh = doc.select("meta[http-equiv=refresh]"); if (!metaRefresh.isEmpty()) { String content = metaRefresh.attr("content"); String[] parts = content.split(";", 2); if (parts.length > 1 && parts[1].trim().toLowerCase().startsWith("url=")) { String redirectUrl = parts[1].trim().substring(4).replace("'", "").replace("\"", "").trim(); // 自动处理相对路径,拼接为完整URL redirectUrl = Jsoup.connect(currentUrl).url().toURI().resolve(redirectUrl).toString(); currentUrl = redirectUrl; redirectCount++; continue; } } // 2. 检查JS动态跳转规则 String html = doc.html(); Matcher matcher = JS_REDIRECT_PATTERN.matcher(html); if (matcher.find()) { String redirectUrl = matcher.group(3).trim(); // 自动处理相对路径,拼接为完整URL redirectUrl = Jsoup.connect(currentUrl).url().toURI().resolve(redirectUrl).toString(); currentUrl = redirectUrl; redirectCount++; continue; } // 未命中任何跳转规则,终止循环 break; } return currentUrl; } }
逻辑说明
- 首先开启
followRedirects(true)配置,优先处理所有3xx类型的HTTP标准重定向 - 按优先级先识别meta标签跳转,再识别JS常见跳转语法,覆盖绝大多数前端跳转场景
- 内置最大跳转次数限制,避免进入无限跳转的死循环
- 自动处理相对路径跳转,自动拼接为完整的可访问URL
内容的提问来源于stack exchange,提问作者Muhammad Arsalan Inam
相关产品推荐
相关产品推荐

