http://www.iteye.com/topic/305642
先建一个客户端拦截器
package cxf;
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.cxf.binding.soap.SoapHeader;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
*
* @Title:在发送消息前,封装Soap Header 信息
*
* @Description:
*
* @Copyright:
*
* @author zz
* @version 1.00.000
*
*/
public class AddSoapHeader extends AbstractSoapInterceptor {
private static String nameURI="http://localhost:8080/sayHello";
public AddSoapHeader(){
super(Phase.WRITE);
}
public void handleMessage(SoapMessage message) throws Fault {
String username="名字";
String password="密码";
QName qname=new QName("RequestSOAPHeader");
Document doc=DOMUtils.createDocument();
//自定义节点
Element spId=doc.createElement("tns:username");
spId.setTextContent(username);
//自定义节点
Element spPass=doc.createElement("tns:password");
spPass.setTextContent(password);
Element root=doc.createElementNS(nameURI, "tns:RequestSOAPHeader");
root.appendChild(spId);
root.appendChild(spPass);
SoapHeader head=new SoapHeader(qname,root);
List<Header> headers=message.getHeaders();
headers.add(head);
}
}
再建一个客户端拦截器
package cxf;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.NodeList;
public class ReadSoapHeader extends AbstractPhaseInterceptor<SoapMessage> {
private SAAJInInterceptor saa = new SAAJInInterceptor();
public ReadSoapHeader() {
super(Phase.PRE_PROTOCOL);
getAfter().add(SAAJInInterceptor.class.getName());
}
public void handleMessage(SoapMessage message) throws Fault {
SOAPMessage mess = message.getContent(SOAPMessage.class);
if (mess == null) {
saa.handleMessage(message);
mess = message.getContent(SOAPMessage.class);
}
SOAPHeader head = null;
try {
head = mess.getSOAPHeader();
} catch (SOAPException e) {
e.printStackTrace();
}
if (head == null) {
return;
}
try {
//读取自定义的节点
NodeList nodes = head.getElementsByTagName("tns:username");
NodeList nodepass = head.getElementsByTagName("tns:password");
//获取节点值,简单认证
if (nodes.item(0).getTextContent().equals("名字")) {
if (nodepass.item(0).getTextContent().equals("密码")) {
// System.out.println("认证成功");
System.out.println("username: "+nodes.item(0).getTextContent());
System.out.println("password: "+nodepass.item(0).getTextContent());
}
} else {
SOAPException soapExc = new SOAPException("认证错误");
throw new Fault(soapExc);
}
} catch (Exception e) {
SOAPException soapExc = new SOAPException("认证错误");
throw new Fault(soapExc);
}
}
}
客户端代码:
package cxf;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
public class CXFClient {
public static void main(String[] args) {
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setAddress("http://localhost:8080/sayHello");
factory.setServiceClass(SayHello.class);
factory.getOutInterceptors().add(new AddSoapHeader());
SayHello sayHello = (SayHello)factory.create();
System.out.println(sayHello.sayHello("哇哈哈"));
}
}
服务器代码:
package cxf;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
public class CXFServer {
public static void main(String[] args) {
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
factory.setAddress("http://localhost:8080/sayHello");
factory.setServiceClass(SayHelloImpl.class);
factory.getInInterceptors().add(new LoggingInInterceptor());
factory.getInInterceptors().add(new ReadSoapHeader());
Server server = factory.create();
server.start();
}
}
OK