如何在 XMLReaderFactory 中设置 FEATURE_SECURE_PROCESSING?

Posted

技术标签:

【中文标题】如何在 XMLReaderFactory 中设置 FEATURE_SECURE_PROCESSING?【英文标题】:How to set FEATURE_SECURE_PROCESSING in XMLReaderFactory? 【发布时间】:2014-06-07 21:35:58 【问题描述】:

我正在使用 Piccolo jar 并使用 XMLReaderFactory 创建 XML 阅读器。 我需要设置安全处理功能,因此我这样做了,

xmlReader = XMLReaderFactory.createXMLReader("com.bluecast.xml.Piccolo"); xmlReader.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);

但这是抛出错误 org.xml.sax.SAXNotRecognizedException: http://javax.xml.XMLConstants/feature/secure-processing at com.bluecast.xml.Piccolo.setFeature(Piccolo.java:937)

我有一个旧的 xercesImpl.jar,它已被 xercesImpl-2.9.1.jar 取代,但仍然出现相同的错误。我用谷歌搜索并没有找到任何具体的解决方案。

请帮忙,任何想法都是可以理解的。

【问题讨论】:

【参考方案1】:

所以常量XMLConstants.FEATURE_SECURE_PROCESSING 的值是http://javax.xml.XMLConstants/feature/secure-processing

根据源代码here(最新的是1.04),一个大的if else块检查看看这个值是否是允许的特性之一,如果不是抛出这个异常。而且事实上,它不是被判断为合法的值之一,因此会抛出异常。

根据SaxParserFactory,我们阅读

所有实现都需要支持 javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING 功能。

Piccolo 实现了 Parser 而不是 SaxParser。所以总而言之,我会说 Piccolo 不支持该功能。也许我会说使用不同的支持它的 XMLReader。

【讨论】:

【参考方案2】:

用于 SAX2 的 Oracle JDK 内部 Xerces 版本的 XMLReaderFactory 足够有趣,也没有提供此功能设置器。我不确定是什么,或者推荐的替代方案应该是什么。有这样的解决方法:

    SAXParserFactory spf = SAXParserFactory.newInstance();
    spf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
    XMLReader reader = spf.newSAXParser().getXMLReader();

奇怪。在内部,它映射到具有不同实体扩展限制的 security-manager (com.sun.org.apache.xerces.internal.utils.XMLSecurityManager)。此外,它将新属性 XMLConstants.ACCESS_EXTERNAL_DTDXMLConstants.ACCESS_EXTERNAL_SCHEMA 设置为 ""(无外部访问权限)。

【讨论】:

以上是关于如何在 XMLReaderFactory 中设置 FEATURE_SECURE_PROCESSING?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中设置 libsvm?

如何在 Laravel 中设置全局变量?

如何在代码中设置绑定?

如何在协议扩展中设置委托

如何在预览中设置环境对象

如何在jdbc中设置锁定超时