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

Spring Boot+Jsoup请求URL时二次转码问题求助

解决Jsoup二次编码URL参数的问题

你遇到的核心问题是Jsoup默认的URL处理逻辑会对已编码的参数进行二次转码——当你的URL已经是正确编码后的状态(比如希伯来语转码得到的name=%F2%EE%E5%F1%20%FA%EE%ED),Jsoup的connect()方法会把%当作普通字符再次编码,变成%25F2%25EE%25E5%25F1%2520%25FA%25EE%25ED,直接导致URL失效。

要强制Jsoup不修改原URL,你可以绕过它的URL编码逻辑,改用Java原生的HttpURLConnection建立连接,再把输入流传给Jsoup解析。这样就能完全保留你原本的URL编码状态,代码示例如下:

try {
    // 直接使用已编码完成的URL创建原生连接
    URL url = new URL(SOME_URL);
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    
    // 保持和原Jsoup代码一致的请求头配置
    connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36");
    connection.setRequestProperty("Referrer", "http://www.google.com");
    connection.setConnectTimeout(5000);
    
    // 让Jsoup从原生连接的输入流中解析文档,同时传入原URL作为基准URL
    doc = Jsoup.parse(connection.getInputStream(), "UTF-8", url.toString());
} catch (IOException e) {
    e.printStackTrace();
}

为什么这个方法有效?

Jsoup的connect()方法内部会自动对URL进行标准化处理,包括编码未转义的字符。但当你的URL已经是完全编码好的状态时,这种处理就会变成二次编码,破坏原本的参数结构。而使用原生HttpURLConnection时,它会严格按照你提供的原始URL发起请求,不会额外修改编码,完美匹配Chrome的访问行为。

另外,你可以确认一下SOME_URL确实是正确编码的(比如Chrome能正常访问),使用上面的方法后,Jsoup解析出来的文档基准URL也会和原URL完全一致,不会出现编码错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:01:39