如何解决使用连接到 WCF 服务的 Java 客户端在 XML 正文中嵌入 XML 指令
我们的 Java 代理需要与基于 WCF 的 ESB/服务通信。
服务似乎希望 XML 负载看起来像这样:
<xmlRequest><?xml version="1.0" encoding="UTF-8" standalone="yes"?><payload/></xmlRequest>
有没有办法绕过 saaj,以便 WCF 服务得到它需要的东西?
详情
- 我知道这是非法的,但他们的服务正在生产中,我正在尝试更换我们的 DataPower 设备。
- 我们当前的安全代理第 3 次迭代是基于 DOM 的。
正如预期的那样,当我使用 XSLT 添加 XML 指令时,saaj 指示了一个错误。
-
我尝试使用以下方法转义 XML 指令:
CDATA to escape the XML directive. CDATA to escape the entire payload. Massaging the directive to look like valid XML Using HTML escape characters.
-
使用了 Ws-Security:spring-ws + WSS4J,因此一旦得到保护,我们就无法在 http 级别出站修改负载。
选项
看起来最可维护的选择是切换到简单的基于 CXF Stream 的方法,使用 WSS4J。
尽职调查 这可能听起来很熟悉,但在我继续使用 CXF 之前,管理层希望确保没有巧妙的技巧来转义该 XML 指令。
解决方法
该部分为处理指令。按照 https://www.w3.org/TR/REC-xml/#sec-pi 和 https://www.w3.org/TR/REC-xml/#sec-prolog-dtd 可以看到文档的开头是 prolog,对于文档期间的处理指令,PITarget 可以是任何但 xml 的东西。因此,您的文档无法再被兼容的解析器解析。
如果您认为以上是对方的要求,请尝试将您的文档序列化为文本节点并将其添加为 xmlRequest 的内容。它看起来像
<xmlRequest><?xml ...
或者,您可以尝试将您的文档序列化为 CDATA 部分 (https://www.w3.org/TR/REC-xml/#sec-cdata-sect),但对我来说,这与您的感觉一样错误。你已经尝试了我的建议。
毕竟 XMLdecl 是可选的 (https://www.w3.org/TR/REC-xml/#NT-prolog)。您是否尝试过在 XSLT 中使用它来省略 xml 声明?
<xsl:output method="xml" omit-xml-declaration="yes" />
如果这一切都不起作用,其他客户端如何发送数据?他们的消息是什么样的?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。