org.xml.sax.SAXNotRecognizedException: Feature ‘http://javax.xml.XMLConstants/feature/secure-process

以下代码在Java 6中运行正常

String resultContent = "<OTA_AVE_RS><Response>......</Response></OTA_AVE_RS>";
                
OTARS otaRS = null;
try {
	JAXBContext context = JAXBContext.newInstance(OTARS.class);
	Unmarshaller shaller = context.createUnmarshaller();
	otaRS = (OTARS)shaller.unmarshal(new StringReader(resultContent));
}catch(Exception e) {
	e.printStackTrace();
}

现在我们升级到Java 8,在执行代码时得到下面这个异常:

org.xml.sax.SAXNotRecognizedException: Feature 'http://javax.xml.XMLConstants/feature/secure-processing' is not recognized.
	at org.apache.xerces.parsers.AbstractSAXParser.setFeature(Unknown Source)
	at org.apache.xerces.jaxp.SAXParserImpl.setFeatures(Unknown Source)
	at org.apache.xerces.jaxp.SAXParserImpl.<init>(Unknown Source)
	at org.apache.xerces.jaxp.SAXParserFactoryImpl.newSAXParserImpl(Unknown Source)
	at org.apache.xerces.jaxp.SAXParserFactoryImpl.setFeature(Unknown Source)
	at com.sun.xml.internal.bind.v2.util.XmlFactory.createParserFactory(XmlFactory.java:121)
	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.getXMLReader(UnmarshallerImpl.java:139)
	at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157)
	at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:214)
	at com.liantuo.finance.utils.AirAvailUtils.main(AirAvailUtils.java:98)

java.lang.IllegalStateException: org.xml.sax.SAXNotRecognizedException: Feature 'http://javax.xml.XMLConstants/feature/secure-processing' is not recognized.
	at com.sun.xml.internal.bind.v2.util.XmlFactory.createParserFactory(XmlFactory.java:128)
	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.getXMLReader(UnmarshallerImpl.java:139)
	at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157)
	at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:214)
	at com.liantuo.finance.utils.AirAvailUtils.main(AirAvailUtils.java:98)
Caused by: org.xml.sax.SAXNotRecognizedException: Feature 'http://javax.xml.XMLConstants/feature/secure-processing' is not recognized.
	at org.apache.xerces.parsers.AbstractSAXParser.setFeature(Unknown Source)
	at org.apache.xerces.jaxp.SAXParserImpl.setFeatures(Unknown Source)
	at org.apache.xerces.jaxp.SAXParserImpl.<init>(Unknown Source)
	at org.apache.xerces.jaxp.SAXParserFactoryImpl.newSAXParserImpl(Unknown Source)
	at org.apache.xerces.jaxp.SAXParserFactoryImpl.setFeature(Unknown Source)
	at com.sun.xml.internal.bind.v2.util.XmlFactory.createParserFactory(XmlFactory.java:121)
	... 4 more

旧版本的xerces与Java 8中的JAX-B不兼容,解决问题的原因是xerces版本过低,更新版本的xerces(2.11.0)中依赖关系:

<dependency>
	<groupId>xerces</groupId>
	<artifactId>xercesImpl</artifactId>
	<version>2.11.0</version>
	<scope>test</scope>
</dependency>

旧版本的xerces依赖我用的是:

<dependency>
	<groupId>xerces</groupId>
	<artifactId>xercesImpl</artifactId>
	<version>2.6.2</version>
</dependency>

 

Xerces是Java生态圈使用最广泛的XML解析器,基本上所有的类库和框架都会在一定程度上使用它。

### Android 中解决 `SAXNotRecognizedException` 和 `disallow-doctype-decl` 的方法 在 Android 开发环境中,如果尝试通过 XML 处理器设置某些特性(如 `"http://apache.org/xml/features/disallow-doctype-decl"`),可能会抛出 `SAXNotRecognizedException` 异常。这是因为 Android 使用的是基于 AOSP (Android Open Source Project) 的简化版 XML 解析库,部分标准 SAX 特性可能不受支持。 为了有效防止 XXE(XML External Entity)攻击并避免此类异常,可以采取以下措施: #### 方法一:禁用外部实体解析 可以通过关闭外部通用实体和参数实体来减少风险。以下是实现方式的一个示例代码片段[^3]: ```java import org.dom4j.io.SAXReader; import java.io.StringReader; public class XmlParser { public static void parseXml(String xmlContent) throws Exception { SAXReader reader = new SAXReader(); // 关闭 DOCTYPE 声明 try { reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); } catch (org.xml.sax.SAXNotRecognizedException e) { System.out.println("The feature 'disallow-doctype-decl' is not recognized."); } // 禁用外部通用实体 reader.setFeature("http://xml.org/sax/features/external-general-entities", false); // 禁用外部参数实体 reader.setFeature("http://xml.org/sax/features/external-parameter-entities", false); StringReader stringReader = new StringReader(xmlContent.trim()); Document document = reader.read(stringReader); } } ``` 上述代码中,即使 `"http://apache.org/xml/features/disallow-doctype-decl"` 抛出了 `SAXNotRecognizedException`,程序仍能继续运行,并成功禁用了其他潜在的安全隐患。 --- #### 方法二:使用自定义 XML Reader 实现过滤机制 对于更复杂的场景,可考虑创建一个继承于默认 XMLReader 的类,在其中手动拦截 DOCTYPE 定义。这种方式绕过了不被识别的功能需求,同时提供了更高的灵活性[^1]。 --- #### 方法三:替换为更安全的解析工具 如果现有 API 存在兼容性问题,则建议切换到更为现代化且安全性更强的第三方库,例如 **Jsoup** 或者 **Jackson Data Binding** 来替代传统的 DOM/SAX 方式处理数据流[^4]。 --- ### 注意事项 尽管设置了以上配置项,但在实际应用过程中还需验证其效果是否达到预期目标。例如测试输入恶意构造的数据样本时是否会触发错误响应或者泄露敏感资源等内容。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值