使用连接到 WCF 服务的 Java 客户端在 XML 正文中嵌入 XML 指令
Posted
技术标签:
【中文标题】使用连接到 WCF 服务的 Java 客户端在 XML 正文中嵌入 XML 指令【英文标题】:Embedding XML directive in XML body using Java Client connecting to WCF service 【发布时间】:2021-08-31 16:30:33 【问题描述】:我们的 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 级别修改有效负载。
我们为合理的用例修改了 spring-ws,但我不相信为这种特殊情况修改 wss4j 是可维护的。
选项
看起来最易于维护的选项是使用 WSS4J 切换到简单的基于 CXF 流的方法。
尽职调查 这听起来可能很熟悉,但在我继续使用 CXF 之前,管理层希望确保没有巧妙的技巧来逃避该 XML 指令。
欢迎任何 cmets,包括好脾气的责骂!
【问题讨论】:
事实证明,即使我要求从我用来捕获数据的应用程序中获取原始输出,它最终还是会漂亮地打印 XML 有效负载。所以 XML 有效负载是 html 编码的,所以它没有发送“<... soapui> 【参考方案1】:该部分是处理指令。按照 https://www.w3.org/TR/REC-xml/#sec-pi 和 https://www.w3.org/TR/REC-xml/#sec-prolog-dtd 您可以看到文档的开头是序言,并且对于文档期间的处理指令,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" />
如果这一切都不起作用,其他客户端如何发送数据?他们的消息是怎样的?
【讨论】:
是的,我知道这是一个处理指令,这就是为什么我在中间指出它是非法的。 很好,我们同意这一点。那么其他客户如何实际使用该服务呢?如果你不能,我怀疑他们可以发送非法数据。 见上面的评论。以上是关于使用连接到 WCF 服务的 Java 客户端在 XML 正文中嵌入 XML 指令的主要内容,如果未能解决你的问题,请参考以下文章