源码教程 2025年06月7日
0 收藏 0 点赞 579 浏览 2057 个字
摘要 :

针对因accessExternalDTD属性限制导致无法通过HTTP访问外部DTD(如MyBatis的mybatis-3-mapper.dtd)的问题,以下是详细的解决方案: 问题原因 Java XML解析器默认禁止从……

针对因accessExternalDTD属性限制导致无法通过HTTP访问外部DTD(如MyBatis的mybatis-3-mapper.dtd)的问题,以下是详细的解决方案:

问题原因

Java XML解析器默认禁止从外部加载DTD(防止XXE攻击),因此当XML文件尝试通过HTTP访问远程DTD(如<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">)时,会抛出以下错误:

org.xml.sax.SAXParseException: 外部 DTD: 无法读取外部 DTD 'mybatis-3-mapper.dtd', 
因为 accessExternalDTD 属性设置的限制导致不允许 'http' 访问

解决方案

根据需求选择以下任意一种方法:

1. 在代码中配置XML解析器(推荐)

在创建DocumentBuilderSAXParser时,显式允许访问HTTP协议的DTD:

import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

public class XmlParser {
    public static void main(String[] args) {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            
            // 关键配置:允许通过HTTP访问外部DTD
            factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "http");
            
            DocumentBuilder builder = factory.newDocumentBuilder();
            builder.parse("input.xml"); // 解析XML文件
        } catch (ParserConfigurationException | SAXException | IOException e) {
            e.printStackTrace();
        }
    }
}

2. 通过JVM参数全局配置

在启动应用时添加以下参数,允许所有XML解析器访问HTTP/HTTPS协议的外部DTD:

java -Djavax.xml.accessExternalDTD=http,https -jar YourApp.jar

3. 使用本地DTD文件(安全推荐)

避免依赖远程DTD,将mybatis-3-mapper.dtd下载到本地,并修改XML的DOCTYPE声明指向本地路径:

  1. 下载DTD文件
    访问 http://mybatis.org/dtd/mybatis-3-mapper.dtd 并将文件保存到项目目录(如
    src/main/resources/dtd/mybatis-3-mapper.dtd)。

  2. 修改XML声明
    将XML中的DOCTYPE路径替换为本地路径:

  3. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
        "classpath:/dtd/mybatis-3-mapper.dtd">

    4. 完全禁用DTD(极端情况)

    如果无需DTD验证,可直接禁用外部实体解析:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); // 启用安全处理
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); // 禁用DOCTYPE

注意事项

  1. 安全风险
    允许外部DTD访问可能引发XXE攻击,确保仅加载可信来源的DTD。

  2. 兼容性
    部分旧版XML解析器(如Apache Xerces 1.x)可能不支持
    ACCESS_EXTERNAL_DTD属性,建议升级到较新版本。

  3. MyBatis框架集成
    若在MyBatis中遇到此问题,建议优先使用本地DTD文件,避免因网络问题导致解析失败。

这里建议使用第三种方法,比较简单,也安全可靠!

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/1934.html

管理员

相关推荐
2025-07-05

对于一些使用WordPress进行外贸建站的商家来说,大部分人会通过在WordPress中添加JS代码和CSS样式表…

701
2025-07-05

当商家遇到WordPress独立站改版或者域名到期等问题时,不免会涉及到WordPress域名的更改,那么这一…

715
2025-07-05

用户在使用WooCommerce进行跨境电商独立站搭建工作时,有可能会借助WooCommerce短代码实现更加醒目…

307
2025-07-05

随着外贸建站行业的不断深入发展,WordPress的多语言功能也显得越来越重要,一个具有多语言的独立站…

1,039
2025-07-05

WooCommerce作为WordPress外贸建站生态的一部分,WooCommerce运费设置是商家在建站过程中不可忽视的…

835
2025-07-05

在外贸建站的过程中,有些商家会选择使用WordPress幻灯片为网站页面增加一定的动感和可观性,进而提…

723
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号