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

首次请求返回状态码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

相关产品推荐
方舟 Agent Plan

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

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