Oracle OSB接收外部请求报Illegal XML character:0x10错误求助
问题排查:Oracle OSB 12c接收含Base64的外部请求报非法XML字符错误
环境与核心问题
- 运行环境:Oracle OSB + WebLogic 12c,XML版本1.0
- 核心现象:接口接收后端系统请求时,消息直接进入错误队列;控制台测试含Base64的消息正常,后端发送不含Base64的请求也正常,仅后端发送带Base64的请求触发报错。
错误堆栈信息
Caused by: org.apache.xmlbeans.XmlException: error: Unexpected element: CDATA ................ Caused by: org.xml.sax.SAXParseException; systemId: file:; lineNumber: 1; columnNumber: 1; Illegal XML character: 0x10
涉及的XQuery CDATA代码
<![CDATA[<ns0:Request xmlns="" xmlns:ns0="http://blabla/testest"> <ns0:MessageType>{ $body/ns0:Request/ns0:MessageType/text() }</ns0:MessageType> <ns0:Feature>{ $body/ns0:Request/ns0:Feature/text() }</ns0:Feature> <ns0:Identity> <ns0:nummer>{ $body/ns0:Request/ns0:Identity/ns0:nummer/text() }</ns0:nummer> <ns0:type>{ $body/ns0:Request/ns0:Identity/ns0:type/text() }</ns0:type> </ns0:Identity> <ns0:InterestedParty>{ $body/ns0:Request/ns0:InterestedParty/text() }</ns0:InterestedParty> <ns0:ReceiveParty> <ns0:nummer>{ $body/ns0:Request/ns0:ReceiveParty/ns0:nummer/text() }</ns0:nummer> <ns0:type>{ $body/ns0:Request/ns0:ReceiveParty/ns0:type/text() }</ns0:type> </ns0:ReceiveParty> <ns0:PartyRole>{ $body/ns0:Request/ns0:PartyRole/text() }</ns0:PartyRole> <ns0:SubjectMessage> <ns0:mimeType>{ $body/ns0:Request/ns0:SubjectMessage/ns0:mimeType/text() }</ns0:mimeType> <ns0:Filename>{ $body/ns0:Request/ns0:SubjectMessage/ns0:Filename/text() }</ns0:Filename> <ns0:subject>{ $body/ns0:Request/ns0:SubjectMessage/ns0:subject/text() }</ns0:subject> </ns0:SubjectMessage> <ns0:autorisatieAdres>http://geenausp.nl</ns0:autorisatieAdres> </ns0:Request> ]]>
已尝试的无效操作
- 在
setDomainenv中添加Java参数-Dcom.bea.osb.http.cookieAsNoComplexElement=true,未解决问题。
排查方向与解决建议
排查方向
- Base64内容差异:后端生成的Base64可能包含XML 1.0禁止的控制字符(如0x10),而控制台测试用的是纯净Base64字符串。XML 1.0仅允许制表符(0x09)、换行(0x0A)、回车(0x0D)三种控制字符,0x10属于非法字符。
- 传输层字符注入:后端发送请求时,HTTP传输过程中可能自动给Base64字段添加了换行或其他控制字符,控制台直接提交数据则无此问题。
- 解析器配置差异:控制台测试与外部请求可能使用不同的XML解析器配置,控制台解析器可能宽松忽略非法字符,生产环境解析器严格遵循规范。
解决建议
- 抓包验证后端请求:用工具抓取后端发送的请求包,用十六进制编辑器查看Base64字段,确认是否存在0x10等非法字符。
- 添加字符过滤逻辑:在OSB代理服务的请求管道中,通过XSLT或自定义Java代码过滤Base64字段中的XML非法控制字符。
- 调整解析器参数:在WebLogic/OSB中添加JVM参数
-Djavax.xml.stream.isCoalescing=true,或调整OSB的XML验证策略为宽松模式,允许忽略部分非法字符。 - 统一传输编码:确认后端与OSB之间的HTTP请求编码一致,避免传输过程中引入额外字符。
内容的提问来源于stack exchange,提问作者The real Van Gogh
相关产品推荐
相关产品推荐

