客户端发送soap请求到服务器端,服务器端验证soap header是否有用户名密码,如果有则继续验证,如果没有则直接抛出异常。header 的xml报文由客户端生成并发出。
服务器端:
package server.element;import javax.xml.namespace.QName;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.headers.Header;
import org.w3c.dom.Element;
public class CXFHeader extends AbstractPhaseInterceptor<SoapMessage>{
public CXFHeader() {
//定义拦截器生效的时间点
super(Phase.PRE_PROTOCOL);
// TODO Auto-generated constructor stub
}
@Override
public void handleMessage(SoapMessage message) throws Fault {
// TODO Auto-generated method stub
//Header header=message.getHeaders();//获取不指定QName的soap请求头,但是与下面的不是同一个类?
Header header1=message.getHeader(new QName("myheaders"));//
if(header1!=null){
Element headerElement=(Element) header1.getObject();
System.out.println(headerElement.getTagName());
String name=headerElement.getElementsByTagName("name").item(0).getTextContent();
String password=headerElement.getElementsByTagName("password").item(0).getTextContent().toString();
if("longwei".equals(name)&&"123456".equals(password)){
System.out.println("恭喜你===============您已通过cxf服务端验证!");
return;
}
else{
System.out.println("很抱歉===============您没有通过cxf服务端验证!");
throw new Fault(new RuntimeException("请求需要一个正确的用户名和密码!"));
}
}
else{
System.out.println("很抱歉,soap请求头为空===============您没有通过cxf服务端验证!");
throw new Fault(new RuntimeException("soap请求头为空!"));
}
}
}
发布服务并添加拦截器
package sever.SayHelloToCXF;
import java.util.List;
import org.apache.cxf.message.Message;
import javax.xml.ws.Endpoint;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.EndpointImpl;
import server.element.CXFHeader;
public class TestSayHelloToCxf {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String address="http://localhost:9001/SayHelloToCXF";
SayHelloToCXF s=new SayHelloToCXF();
s.sayHello("jiangmen");
Endpoint e=Endpoint.publish(address, s);
EndpointImpl endpointImpl = (EndpointImpl) e;
//服务端的日志入拦截器
List<Interceptor<? extends Message>> inInterceptors = endpointImpl.getInInterceptors();//实例化类
inInterceptors.add(new LoggingInInterceptor());//message会自动输出日志
inInterceptors.add(new CXFHeader());
//服务端的日志出拦截器
List<Interceptor<? extends Message>> outInterceptors = endpointImpl.getOutInterceptors();//实例化类
outInterceptors.add(new LoggingOutInterceptor());
}
}
客户端:
拦截器
package test.client.test;
import java.util.List;
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import com.sun.msv.verifier.jaxp.DocumentBuilderFactoryImpl;
public class ClientInterpretor extends AbstractPhaseInterceptor<SoapMessage> {
public ClientInterpretor() {
super(Phase.PRE_PROTOCOL);
// TODO Auto-generated constructor stub
}
@Override
public void handleMessage(SoapMessage message) throws Fault {
//soap请求头的内容
myheader header=new myheader();
header.setName("longwei");
header.setPassword("123456");
//添加soap请求头
List<Header> list=message.getHeaders();
DocumentBuilderFactoryImpl factory=new DocumentBuilderFactoryImpl();
DocumentBuilder df;
try {
df = factory.newDocumentBuilder();
Document d=df.newDocument();
Element roote=d.createElement("myheaders");
Element e1=d.createElement("name");
e1.setTextContent(header.getName());
Element e2=d.createElement("password");
e2.setTextContent(header.getPassword());
roote.appendChild(e1);
roote.appendChild(e2);
Header h=new Header(new QName("myheaders"), roote);
list.add(h);
System.out.println("================="+h.getName());
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端调用服务器端:
添加客户端出拦截器
package test.client.test;
import java.util.List;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.message.Message;
import test.client.SayHelloToCXF;
import test.client.SayHelloToCXFService;
public class Test01 {
public static void main(String[] args){
SayHelloToCXFService servers=new SayHelloToCXFService();
SayHelloToCXF s=servers.getSayHelloToCXFPort();
//发送请求的客户端对象
Client c=ClientProxy.getClient(s);
//客户端的自定义出拦截器
List<Interceptor<? extends Message>> outInterceptors = c.getOutInterceptors();
outInterceptors.add(new ClientInterpretor());
s.getAll();
}
}