微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用连接到 WCF 服务的 Java 客户端在 XML 正文中嵌入 XML 指令

如何解决使用连接到 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 级别出站修改负载

  • 我们针对合理的用例修改了 spring-ws,但我认为针对这种特殊情况修改 wss4j 是不可维护的。

选项

看起来最可维护的选择是切换到简单的基于 CXF Stream 的方法,使用 WSS4J。

尽职调查 这可能听起来很熟悉,但在我继续使用 CXF 之前,管理层希望确保没有巧妙的技巧来转义该 XML 指令。

欢迎任何评论包括善意的责备!

解决方法

该部分为处理指令。按照 https://www.w3.org/TR/REC-xml/#sec-pihttps://www.w3.org/TR/REC-xml/#sec-prolog-dtd 可以看到文档的开头是 prolog,对于文档期间的处理指令,PITarget 可以是任何但 xml 的东西。因此,您的文档无法再被兼容的解析器解析。

如果您认为以上是对方的要求,请尝试将您的文档序列化为文本节点并将其添加为 xmlRequest 的内容。它看起来像

<xmlRequest>&lt;?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 举报,一经查实,本站将立刻删除。