范围和顺序

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

javax.xml.XMLConstants#FEATURE_SECURE_PROCESSING (FSP)是 XML 处理器的必需功能,包括 DOM,SAX,模式验证,XSLT 和 XPath。当设置为true时,建议实现启用上面指定的新属性定义的访问限制。为了兼容性,JAXP 1.5 不启用新的限制,尽管默认情况下 FSP 对于 DOM,SAX 和模式验证是正确的。

对于 JDK 8,当显式设置 FSP 时,建议将新的accessExternal *属性设置为空字符串。这只是通过 API 设置 FSP 的情况,例如factory.setFeature(FSP,true)。虽然默认情况下 FSP 对于 DOM,SAX 和模式验证是正确的,但它不被视为“显式”设置,因此默认情况下 JDK 8 不设置限制。

jaxp.properties文件中指定的属性会影响 JDK 或 JRE 的所有调用,并将覆盖其默认值,或者可能由 FEATURE_SECURE_PROCESSING 设置的值。

设置时,系统属性将仅影响一个调用,并将覆盖默认设置或 jaxp.properties 中设置的设置,或者可能由 FEATURE_SECURE_PROCESSING 设置的设置。

通过 JAXP 工厂或SAXParser指定的 JAXP 属性优先于系统属性, jaxp.properties文件,以及javax.xml.XMLConstants#FEATURE_SECURE_PROCESSING

新的 JAXP 属性对它们在以下情况下尝试限制的相关构造没有影响:

  • 当有一个解析器并且解析器返回的源不为 null。这适用于可在 SAX 和 DOM 解析器上设置的实体解析器,StAX 解析器上的 XML 解析器,SchemaFactory 上的 LSResourceResolver,Validator 或 ValidatorHandler 或变换器上的 URIResolver。
  • 通过调用SchemaFactorynewSchema方法显式创建模式时。
  • 不需要外部资源时。例如,参考实现支持以下特征/属性,并且可以用于指示处理器不加载外部 DTD 或解析外部​​实体。

    1. http://apache.org/xml/features/disallow-doctype-decl true
    2. http://apache.org/xml/features/nonvalidating/load-external-dtd false
    3. http://xml.org/sax/features/external-general-entities false
    4. http://xml.org/sax/features/external-parameter-entities false