针对因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' 访问
根据需求选择以下任意一种方法:
在创建DocumentBuilder或SAXParser时,显式允许访问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();
}
}
}在启动应用时添加以下参数,允许所有XML解析器访问HTTP/HTTPS协议的外部DTD:
java -Djavax.xml.accessExternalDTD=http,https -jar YourApp.jar
避免依赖远程DTD,将mybatis-3-mapper.dtd下载到本地,并修改XML的DOCTYPE声明指向本地路径:
下载DTD文件
访问 http://mybatis.org/dtd/mybatis-3-mapper.dtd 并将文件保存到项目目录(如src/main/resources/dtd/mybatis-3-mapper.dtd)。
修改XML声明
将XML中的DOCTYPE路径替换为本地路径:
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "classpath:/dtd/mybatis-3-mapper.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安全风险
允许外部DTD访问可能引发XXE攻击,确保仅加载可信来源的DTD。
兼容性
部分旧版XML解析器(如Apache Xerces 1.x)可能不支持ACCESS_EXTERNAL_DTD属性,建议升级到较新版本。
MyBatis框架集成
若在MyBatis中遇到此问题,建议优先使用本地DTD文件,避免因网络问题导致解析失败。
这里建议使用第三种方法,比较简单,也安全可靠!





B2C电商系统商城源码支持pC+小程序+公众号+H5可打包App源...
原生开发淘宝客App,Android+ios独立开发,全开源支持二...
知识付费系统在线教育平台源码+题库系统源码,PC+公众号商业授权...
B2C单商户电商系统源码部署小程序+公众号+H5+App源码...
教育知识付费系统源码带题库功能商业授权公众号+H5源码...