这些Java教程是为JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java语言变更了解Java SE 9及后续版本中更新的语言功能的摘要。
请参阅JDK发布说明以获取有关所有JDK版本的新功能、增强功能和删除或不推荐选项的信息。
本节重点介绍了JAXP 1.5中引入的新属性。
只有在应用程序处理不受信任的XML内容时才需要限制获取外部资源。不处理不受信任内容的内部系统和应用程序不需要担心新的限制或进行任何更改。自7u40和JDK8以来,默认情况下没有这些限制的要求,应用程序在升级到7u40和JDK8时不会有任何行为变化。
对于处理不受信任的XML输入、模式或样式表的应用程序,如果已经存在安全措施,例如启用Java安全管理器以仅授予受信任的外部连接,或使用解析器解析实体,则不需要使用JAXP 1.5中添加的新功能。
然而,JAXP 1.5确实为不使用安全管理器运行的系统和应用程序提供了直接的保护措施。对于这种应用程序,可以考虑使用下面详细描述的新功能来限制。
当改变代码可行时,通过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是一个普通的配置文件。它位于${java.home}/lib/jaxp.properties,其中java.home是JRE的安装目录,例如[安装目录路径]/jdk7/jre。
可以通过将以下行添加到jaxp.properties文件中来设置外部访问限制:
javax.xml.accessExternalStylesheet=file, http
设置后,所有对JDK/JRE的调用将遵守加载外部样式表的限制。
对于不希望XML处理器允许任何外部连接的系统,此功能可能非常有用,此时,可以将所有三个属性设置为例如仅限文件。