我需要使用一个SOAP API,该API请求将所有消息签名为策略“ SigOnly”。
我已经使用wsimport
从WSDL生成了客户端代码,我希望它也能够生成用于签名的代码,但事实并非如此。
MyWebservice service = new MyWebservice();
MyWebservicePortType port = service.getMyWebserviceSOAPportHttp();
// Build request
ObjectFactory objectFactory = new ObjectFactory();
MyRequest request = objectFactory.createMyRequest();
// Call endpoint
port.myRemoteMethod(request);
wsimport
工具是否需要额外的开关来生成用于签名的代码,或者我错过了客户端代码中的某些步骤?
答案 0 :(得分:0)
WS-Security是对soap的扩展,因此我认为wsimport不能在代码生成中处理它。 无论如何,您可以编写处理程序以在soap请求中添加ws-security标头。 您可以通过以下方式将处理程序添加到端口:
BindingProvider bp = (BindingProvider) port;
List<Handler> handlerChain = new ArrayList<Handler>();
handlerChain.add( new MyHandler() );
Binding binding = bp.getBinding();
binding.setHandlerChain(handlerChain);
MyHandler类必须实现SOAPHandler。 这是MyHandler的handleMessage方法的实现示例,其中添加了标头
@Override
public boolean handleMessage(SOAPMessageContext smc) {
Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (outboundProperty.booleanValue()) {
SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope();
SOAPHeader header = envelope.addHeader();
SOAPElement security = header.addChildElement("Security", "wsse",
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
SOAPElement usernameToken = security.addChildElement("UsernameToken", "wsse");
SOAPElement username = usernameToken.addChildElement("Username", "wsse");
username.addTextNode("MyUser");
}
}