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

如何防止Jsoup调用clean方法时移除a标签的href属性?

问题原因

这是配置遗漏导致的,并非Jsoup本身的bug:

  • Safelist.relaxed()默认已经将a标签、href属性纳入白名单,你额外调用addTags("a")、addAttributes("a", "href")是冗余操作,不会改变校验结果。
  • Jsoup的白名单对URL类型的属性(比如a标签的href、img标签的src)设置了两层校验规则:第一层是属性本身属于对应标签的允许属性列表,第二层是属性值对应的URL协议必须在合法协议范围内。你使用的是无baseUri参数的Jsoup.clean(html, safelist)重载方法,对于示例中/foo/这类相对路径的href值,Jsoup没有基准URI无法解析其对应的协议类型,为了拦截javascript:这类恶意伪协议注入,会直接将该属性移除。
修复方案

调用携带baseUri参数的clean方法重载即可。baseUri仅用于解析HTML中的相对路径,只需要是合法URL格式即可,不要求真实可访问。
修正后的可运行代码:

public static void main(String[] args)
{
    final String foo = "<a href='/foo/'>Foo</a>";
    // 传入基准URI,默认relaxed规则已满足保留a标签href属性的需求
    final String cleansedOutput = Jsoup.clean(foo, "https://placeholder.local", Safelist.relaxed());

    System.out.println("foo: " + foo);
    System.out.println("cleansedOutput: " + cleansedOutput);
}

代码运行输出如下,href属性会被正常保留:

foo: <a href='/foo/'>Foo</a>
cleansedOutput: <a href="/foo/">Foo</a>

如果需要支持自定义协议的链接(比如tel:、sms:),可以通过Safelist.addProtocols("a", "href", "tel", "sms")方法追加允许的协议类型。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 06:24:30