使用属性

原文: https://docs.oracle.com/javase/tutorial/jaxp/properties/usingProps.html

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

何时使用属性

仅当应用程序处理不受信任的 XML 内容时,才需要获取外部资源的限制。不处理不受信任内容的内部系统和应用程序不需要关注新限制或进行任何更改。由于默认情况下 7u40 和 JDK8 对此类限制没有要求,因此升级到 7u40 和 JDK8 时应用程序不会发生任何行为更改。

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

但是,JAXP 1.5 确实为没有安全管理器的系统和应用程序提供直接保护。对于这样的应用,可以通过使用如下详细描述的新特征来考虑限制。

通过 API 设置属性

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

  1. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  2. dbf.setAttribute(name, value);
  3. SAXParserFactory spf = SAXParserFactory.newInstance();
  4. SAXParser parser = spf.newSAXParser();
  5. parser.setProperty(name, value);
  6. XMLInputFactory xif = XMLInputFactory.newInstance();
  7. xif.setProperty(name, value);
  8. SchemaFactory schemaFactory = SchemaFactory.newInstance(schemaLanguage);
  9. schemaFactory.setProperty(name, value);
  10. TransformerFactory factory = TransformerFactory.newInstance();
  11. factory.setAttribute(name, value);

以下是仅针对外部 DTD 将 DOM 解析器限制为本地连接的示例:

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

当可以进行代码更改时,对于新开发,建议按照上面的说明设置新属性。通过以这种方式设置属性,应用程序可以确保维护所需的行为,无论它们是部署到较旧版本还是较新版本的 JDK,还是通过系统属性或jaxp.properties设置属性。

使用系统属性

如果更改代码不可行,则系统属性可能很有用。

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

  1. //allow resolution of external schemas
  2. System.setProperty("javax.xml.accessExternalSchema", "file, http");
  3. //this setting will affect all processing after it's set
  4. some processing here
  5. //after it's done, clear the property
  6. System.clearProperty("javax.xml.accessExternalSchema");

使用 jaxp.properties

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

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

  1. javax.xml.accessExternalStylesheet=file, http

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

此功能对于不希望允许 XML 处理器进行任何外部连接的系统可能很有用,在这种情况下,所有三个属性都可以设置为,例如,仅文件。