使用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
代码如下:
处理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 stub
Assert.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;
}