文档

Java™ 教程
隐藏目录
使用属性
教程: Java XML处理API(JAXP)
课程: JAXP 1.5和新属性

使用属性

本节重点介绍了JAXP 1.5中引入的新属性。

何时使用属性

只有在应用程序处理不受信任的XML内容时才需要限制获取外部资源。不处理不受信任内容的内部系统和应用程序不需要担心新的限制或进行任何更改。自7u40和JDK8以来,默认情况下没有这些限制的要求,应用程序在升级到7u40和JDK8时不会有任何行为变化。

对于处理不受信任的XML输入、模式或样式表的应用程序,如果已经存在安全措施,例如启用Java安全管理器以仅授予受信任的外部连接,或使用解析器解析实体,则不需要使用JAXP 1.5中添加的新功能。

然而,JAXP 1.5确实为不使用安全管理器运行的系统和应用程序提供了直接的保护措施。对于这种应用程序,可以考虑使用下面详细描述的新功能来限制。

通过API设置属性

当改变代码可行时,通过JAXP工厂或解析器设置新属性是启用限制的最佳方法。可以通过以下接口设置属性:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setAttribute(name, value);
 
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser parser = spf.newSAXParser();
parser.setProperty(name, value);
 
XMLInputFactory xif = XMLInputFactory.newInstance();
xif.setProperty(name, value);
 
SchemaFactory schemaFactory = SchemaFactory.newInstance(schemaLanguage);
schemaFactory.setProperty(name, value);
 
TransformerFactory factory = TransformerFactory.newInstance();
factory.setAttribute(name, value);

以下是将DOM解析器限制为仅允许本地连接的示例:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
    dbf.setAttribute({{XMLConstants.ACCESS_EXTERNAL_DTD}}, "file, jar:file");
} catch (IllegalArgumentException e) {
    //jaxp 1.5 feature not supported
}

如果可以改变代码,并且是新的开发,则建议按照上面示例的方式设置新属性。通过以这种方式设置属性,应用程序可以确保在部署到较旧或较新版本的JDK时,无论是通过系统属性还是jaxp.properties设置属性,都可以保持所需的行为。

使用系统属性

如果无法更改代码,系统属性可能很有用。

如果希望为整个JDK/JRE调用设置限制,则在命令行上设置系统属性;如果只需要对应用程序的一部分进行设置,则可以在该部分之前设置系统属性,并在之后将其清除。例如,以下代码显示了如何使用系统属性:

//允许解析外部模式

System.setProperty("javax.xml.accessExternalSchema", "file, http");

//此设置将影响设置后的所有处理
一些处理

//处理完成后,清除属性
System.clearProperty("javax.xml.accessExternalSchema");

使用jaxp.properties

jaxp.properties是一个普通的配置文件。它位于${java.home}/lib/jaxp.properties,其中java.home是JRE的安装目录,例如[安装目录路径]/jdk7/jre

可以通过将以下行添加到jaxp.properties文件中来设置外部访问限制:

javax.xml.accessExternalStylesheet=file, http

设置后,所有对JDK/JRE的调用将遵守加载外部样式表的限制。

对于不希望XML处理器允许任何外部连接的系统,此功能可能非常有用,此时,可以将所有三个属性设置为例如仅限文件。


上一页: JDK中的属性设置
下一页: 错误处理