gpt4 book ai didi

java - 如何使用 SOAPHandlers 签署 MTOM SOAP 消息?

转载 作者:行者123 更新时间:2023-11-29 05:56:23 27 4
gpt4 key购买 nike

目前,我有两个处理程序,一个用于日志记录,一个用于签署 SOAP 消息(本质上会篡改 SOAP 消息)。如果没有处理程序链,MTOM 会按预期工作,插入对二进制内容的引用,而不是内联 base64 二进制内容。

一旦我引入处理程序,MTOM 内容现在就内联包含在内。

是否可以使用处理程序来签署 SOAP 消息,或者是否有更合适的方式来执行此操作?

更新 1无法发布完整的源代码。但本质上,自定义 SOAPHandler 实现。它对时间戳(在 header 中)、自定义 header 和 SOAP 主体执行一些基本的 XMLDsig 类型操作。然后将生成的摘要值注入(inject) header 中的签名元素。

关于记录器,它又是一个简单的 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 传输的图像的简单服务来重现您的问题。我发现,如果我在设置处理程序之前放置启用 MTOM 的代码,它就会正确地对消息进行编码。如果我先设置处理程序,它不会。这是我设置正常运行的客户端代码的地方:

Service service = Service.create(url, qname);

Greeting greeting = service.getPort(Greeting.class);

BindingProvider bp = (BindingProvider) greeting;
SOAPBinding binding = (SOAPBinding) bp.getBinding();
binding.setMTOMEnabled(true);

service.setHandlerResolver(new HandlerResolver() {
@SuppressWarnings("rawtypes")
public List<Handler> getHandlerChain(PortInfo portInfo) {
List<Handler> handlerList = new ArrayList<Handler>();
handlerList.add(new RGBSOAPHandler());
return handlerList;
}
});

RGBSOAPHandler 只是我从另一个 SO answer 获取的一些示例代码.

编辑:此外,如果我尝试在 binding 而不是 service 上设置处理程序,那么我会遇到与您相同的问题。所以如果它看起来像这样:

Service service = Service.create(url, qname);

Greeting greeting = service.getPort(Greeting.class);

BindingProvider bp = (BindingProvider) greeting;
SOAPBinding binding = (SOAPBinding) bp.getBinding();
binding.setMTOMEnabled(true);

List<Handler> handlerList = new ArrayList<Handler>();
handlerList.add(new RGBSOAPHandler());
binding.setHandlerChain(handlerList);

然后我的文件被内联编码。我不知道这是为什么,但我想答案是“不要那样做”。在 Service 对象上设置您的处理程序。

关于java - 如何使用 SOAPHandlers 签署 MTOM SOAP 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11944663/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com