- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有以下代码:
final TransformerFactory factory = TransformerFactory.newInstance();
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
第二行在具有默认 TransformerFactory
的现代 JDK(我试过 1.8)中运行良好。但是当我将 xalan
(版本 2.7.2,最新版本)添加到类路径时,我在第二行得到以下内容:
Exception in thread "main" java.lang.IllegalArgumentException: Not supported: http://javax.xml.XMLConstants/property/accessExternalDTD
at org.apache.xalan.processor.TransformerFactoryImpl.setAttribute(TransformerFactoryImpl.java:571)
at Main.main(Main.java:11)
我猜这是因为xalan的TransformerFactory
不支持这个属性。 Xalan 的实现通过 ServiceLoader
机制获取:它在 xalan jar 的 services/javax.xml.transform.TransfomerFactory
中指定。
可以使用 javax.xml.transform.TransformerFactory
系统属性或 $JRE/lib/jaxp.properties
覆盖 TransformerFactory
实现code> 文件,或者直接在代码中传递类名。但要做到这一点,我必须提供一个具体的类名。现在,它是 com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
,但是在系统属性中对其进行硬编码有点可怕,因为在 JDK 升级时它们可以轻松地更改类名,我们只会得到一个运行时错误。
有什么方法可以指示 TransformerFactory.newInstance()
忽略 xalan 提供的实现吗?或者告诉它“只使用系统默认值”。
附言我不能只从类路径中删除 xalan
,因为我们使用的许多其他库都依赖于它。
最佳答案
我在这里唯一可以实现的是硬编码 JDK 默认工厂并使用正常的发现过程作为后备:
TransformerFactory factory;
try {
//the open jdk implementation allows the disabling of the feature used for XXE
factory = TransformerFactory.newInstance("com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl", SecureXmlFactories.class.getClassLoader());
} catch (Exception | TransformerFactoryConfigurationError e) {
//this part uses the default implementation of in xalan 2.7.2
LOGGER.error("Cannot load default TransformerFactory, le's try the usual way", e);
//not advisable if you dont want your application to be vulnerable. If needed you can put null here.
factory = TransformerFactory.newInstance();
}
然后在try/catch
下配置
// this works everywhere, but it does not disable accessing
// external DTDs... still enabling it just in case
try {
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
} catch (TransformerConfigurationException e) {
LOGGER.error("Cannot enable secure processing", e);
}
// this does not work in Xalan 2.7.2
try {
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
} catch (Exception e) {
LOGGER.error("Cannot disable external DTD access", e);
}
// this does not work in Xalan 2.7.2
try {
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");
} catch (Exception e) {
LOGGER.error("Cannot disable external stylesheet access", e);
}
并监控日志以查看默认 JDK 工厂类名称是否/何时更改。
关于java - 是否可以避免使用 xalan TransformerFactory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50000756/
我正在为框架编写一个插件,它将我的代码作为子类加载器加载 问题是该框架使用某个 Xerces 版本,与我的代码不兼容,我想使用我的“自己的”jar for xerces,但似乎由于旧版本已经加载,我不
我正在运行一个从 https://svn.wso2.org/repos/wso2/people/suresh/saml2/sso-demo/src-dist 下载的 Maven 项目问题是,它可以在另
考虑这段代码(完全基于飞碟的“入门”代码,保留他们的权利): package flyingsaucerpdf; import java.io.File; import java.io.FileOutp
我正在尝试使用 xalan XPathAPI 解析 xhtml 文件。我被以下要求困住了。这是 xhtml 的片段
我有一个 Java 程序(目前在 JDK 1.5 中运行),它在使用 Xalan 处理 XSLT 样式表时出现奇怪的异常。我不是在寻找如何解决异常:网上有很多关于这个的信息。我只想知道如何在我的代码中
我正在寻找一种方法,使 xalan 在 .xml 到 .fo 转换中生成的章节编号中不包含某些字母。我正在使用 org.apache.xalan.xsltc.trax.TransformerFacto
我正在使用 xalan 2.7.1 通过 xslt 样式表验证我的 xml 文档。它适用于第一个文档,并在出现错误时返回错误消息以及 xml 源的正确行号和列号,方法是使用 NodeInfo.line
我的xsl文件
我有一个 JSP,它将 XSL 附加到从数据库中提取的 XML 文档。该应用程序正在使用 Saxon 解析器,但我的 XML 需要使用 Xalan 解析器。 JSP 页面可以覆盖要使用的解析器吗? 最
我正在尝试编译一个示例 Visual C++ 2008 项目来测试 Xalan-C++ 库。当我尝试编译该项目时,它给出了一条错误消息“xalan-c_1_11d.dll is missing”。当我
我正在使用 Xalan-C++ 进行 XSLT 转换,但我在这段代码中遇到了段错误: XalanTransformer evalTransformer; evalTransformer.setUseV
我有以下代码: final TransformerFactory factory = TransformerFactory.newInstance(); factory.setAttribute(XM
我的项目有一个报告模块,它以 XML 的形式从数据库中收集数据,并在其上运行 XSLT 以生成用户所需格式的报告。此时的选项是 HTML 和 CSV。 我们使用 Java 和 Xalan 与数据进行所
本文整理了Java中org.apache.xalan.extensions.XSLProcessorContext类的一些代码示例,展示了XSLProcessorContext类的具体用法。这些代码示
我有一个应用程序,我使用 Xalan 作为 XSLT 处理器。我现在想使用撒克逊语。我想确保所有现有的转换仍然有效。因此我想对所有现有的 XML 文件使用 Xalan。对于新的 XML 文件,我想使用
我在 eclipse 插件中使用 xalan 时遇到问题。 当我尝试通过以下方式创建工厂实例时: TransformerFactory tFactory = TransformerFactory.ne
我有以下基于 Xalan 的 XSLT: TransformerFactory factory = TransformerFactory.newInstance(); XalanErrorListen
我们继承了一个应用程序(基于 Java,在 WebLogic 10.3.5 上运行),该应用程序广泛使用 JSTL XML 标记,特别是 XPath 选择器。由于这些标记的实现以及 DTMManage
我在 editing an XML file in a stream 上实现此问题的解决方案时遇到问题。我收到 MalFormedUrlException:无协议(protocol)。 XML 文件编
在我看来,JDK 6(和 7)附带的 Xalan 版本不处理输入文件中的注释,如 ... 所指定的那样。 给定以下输入文件,dangling.xml A bar where I dr
我是一名优秀的程序员,十分优秀!