【发布时间】:2012-08-10 07:03:09
【问题描述】:
目前,我有两个处理程序,一个用于记录日志,一个用于签署 SOAP 消息(它固有地篡改 SOAP 消息)。如果没有处理程序链,MTOM 会按预期工作,插入对二进制内容的引用,而不是内联 base64 二进制内容。
只要我介绍了一个处理程序,MTOM 内容现在就内嵌了。
是否可以使用处理程序对 SOAP 消息进行签名,或者是否有更合适的方法来执行此操作?
更新 1 无法发布完整来源。本质上,自定义 SOAPHandler 实现。它对时间戳(在标头中)、自定义标头和 SOAP 主体执行一些基本的 XMLDsig 类型操作。然后将生成的摘要值注入到标头中的签名元素中。
关于记录器,它又是一个简单的 SOAPHandler。如果独占使用它或签名处理程序,则结果是相同的,即内联字节内容的 MTOM 消息。我取得的唯一进展是使用 MessageHandler 进行日志记录。这使我能够输出 SOAP 信封(尽管内联了字节内容)并且仍然保持 MTOM 分离。因此,这并不是真正的解决方案,而是表明 SOAP 消息的任何修改都需要在较低级别进行。这让我走上了管子的道路。
更新 2
以下是MessageHandler 方法的示例。您可以看到原始 HTTP 转储将包含多部分消息,而实际输出内联 base64。此实现与SOAPHandler 实现之间的唯一区别是实际的 HTTP 请求更改为单部分内联 MTOM 消息。
@Override
public boolean handleMessage(MessageHandlerContext context) {
HttpTransportPipe.dump = true;
Boolean isOutgoing = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (isOutgoing) {
System.out.println("\nOutbound message:");
XMLStreamWriter writer = XMLStreamWriterFactory.create(System.out);
try {
context.getMessage().writeTo(writer);
} catch (XMLStreamException e) {
throw new IllegalStateException("Unable to write");
}
} else {
System.out.println("\nInbound message:");
}
return true;
}
【问题讨论】:
-
您可以发布您使用的处理程序代码吗?日志处理程序会干扰 MTOM 编码,还是仅干扰签名处理程序?
-
如果仅使用记录器 SOAPHandler 本身会导致问题,请关注此问题。您可以发布该代码吗?下面的答案可以根据需要运行,一个 MTOM 多部分消息(即不是内联),因此您的处理程序代码必须有一些独特的东西。
标签: java java-metro-framework mtom xml-dsig