能否移除Apache Xalan实现类改用TransformerFactory默认实例?
替换TransformerFactory实现类的可行性分析
直接改用TransformerFactory.newInstance()无参方法是可行的,但需要关注以下几个核心点:
一、默认实现的选择逻辑
无参的newInstance()会按以下优先级自动选取TransformerFactory实现:
- 优先读取系统属性
javax.xml.transform.TransformerFactory指定的类 - 其次读取JRE/lib/jaxp.properties配置文件中声明的实现
- 再通过服务提供者加载机制(扫描META-INF/services/javax.xml.transform.TransformerFactory文件)
- 最后 fallback 到JDK内置的默认实现(现代JDK中已替换掉存在漏洞的旧Xalan版本,使用安全合规的内置实现)
二、兼容性验证要点
旧代码硬编码Xalan实现,可能隐含了对Xalan特定特性的依赖,需要做针对性测试:
- 测试SVG文档的转换逻辑是否正常,输出结果是否和原代码一致
- 检查项目中是否使用了Xalan独有的XSLT扩展、自定义处理器等,如果有这类依赖,直接替换可能出现功能异常,需要重构代码适配新实现
三、安全保障建议
- 确保项目使用的JDK版本足够新,现代OpenJDK/Oracle JDK已移除存在漏洞的旧Xalan实现,默认的TransformerFactory已修复相关安全问题
- 如果需要更明确的控制,可以通过设置系统属性显式指定安全的实现类,避免意外加载旧版本
备选方案:使用第三方XSLT处理器
如果默认实现无法满足兼容性需求,推荐使用维护活跃、安全性有保障的第三方实现,比如Saxon:
- 引入Saxon依赖(以Maven为例):
<dependency> <groupId>net.sf.saxon</groupId> <artifactId>Saxon-HE</artifactId> <version>最新稳定版</version> </dependency>
- 可以通过显式指定类名使用:
TransformerFactory factory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", SomeSVGDocument.class.getClassLoader());
或者依赖服务提供者机制,让newInstance()自动加载Saxon实现
内容的提问来源于stack exchange,提问作者BuZZ-dEE
相关产品推荐
相关产品推荐

