编写 WS-Security 相关的辅助类
为了在 Web 服务的请求中加入 UsernameToken 信息,需要编写一个辅助的 SOAP 消息 Handler,来配合生成的 Java 客户端一起使用。在 SOAP 消息发出前,该 Handler 会将用户名密码以 WS-Security 定义的格式写入消息头部,用以标识服务调用者的身份。下面是 Handler 的部分代码,完整的类定义可在附件中得到。
代码一 SOAP 消息 Handler
public class UsernameTokenSigner extends GenericHandler { // …… public boolean handleRequest(MessageContext mc) { try { SOAPMessage msg = ((SOAPMessageContext) mc).getMessage(); SOAPPart part = msg.getSOAPPart(); SOAPEnvelope envelope = part.getEnvelope(); SOAPHeader header = envelope.getHeader(); if (header == null) header = envelope.addHeader(); SOAPHeaderElement wsSecurityElement = (SOAPHeaderElement)\ header.addChildElement(wsSecurityElementName); wsSecurityElement.setMustUnderstand(true); SOAPElement userNameTokenElement = wsSecurityElement.addChildElement("UsernameToken", "wsse"); SOAPElement userNameElement = userNameTokenElement.addChildElement("Username", "wsse"); userNameElement.addTextNode(username); SOAPElement passwordElement = userNameTokenElement.addChildElement("Password", "wsse"); passwordElement.addTextNode(password); passwordElement.addAttribute(envelope.createName(TYPE), PASSWORD_TYPE); } catch (SOAPException e) { } return true; } // …… } |