使用Spring 的Interceptor 机制读取SOAP header时,需要注意的问题
使用Spring Interceptor 机制读取Web Service 的SOAP请求时,由于在SOAP请求里,xml的元素之间可能会包含空格、回车符、制表符,所以在用dom node读取SOAP xml时,需要对读取的当前元素的类型作判断。判断当前元素的类型是ELEMENT_NODE 还是 TEXT_NODE.
处理SOAP请求时,涉及到了如下三种dom的操作方式,
1. org.springframework.ws.context.MessageContext
2. javax.xml.transform.dom.DOMResult
3. org.w3c.dom.NodeList, org.w3c.dom.Node
代码如下:
public boolean handleRequest(MessageContext messageContext, Object endpoint)throws Exception {// TODO Auto-generated method stubAssert.isInstanceOf(SoapMessage.class, messageContext.getRequest());SoapMessage request = (SoapMessage) messageContext.getRequest(); SoapHeader header = request.getSoapHeader(); String username = ""; String password = ""; for (Iterator iterator = header.examineAllHeaderElements(); iterator.hasNext();) {SoapHeaderElement headerElement = (SoapHeaderElement) iterator.next();NodeList children = ((DOMResult)headerElement.getResult()).getNode().getChildNodes();for (int i = 0; i < children.getLength(); i++) {if (children.item(i).getNodeType() == Node.ELEMENT_NODE) { Node node = (Node) children.item(i);if ("se:user".equalsIgnoreCase(node.getNodeName())) {username = node.getChildNodes().item(0).getTextContent();} else if ("se:pass".equalsIgnoreCase(node.getNodeName())) {password = node.getChildNodes().item(0).getTextContent();}} else if (children.item(i).getNodeType() == Node.TEXT_NODE) {} }}return true;}