cxf自定义用户拦截器

客户端发送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();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值