首页 > 代码库 > CXF拦截器
CXF拦截器
在WebService中服务的传递实质上是soap消息的传递,soap消息主要分为两个部分header和body,其中body是一个标准的xml格式,里面载有发送的消息,如果我们还有额外的消息要进行传递,也可以认为我们在调用服务时,首先需要验证才能通过,那么此时就需要验证信息,在默认情况下soap中是没有header的因此我们可以将验证的信息放在header中,而这一个传递和接受的过程实质上是一个生成和解析xml的过程,此时我们就可以通过拦截器实现这一功能,拦截器分为in拦截器和out拦截器,对于webService的服务端和客户端都有相应的in、out拦截器。拦截器是要实现interceptor接口的,但是我们用户自定义拦截器一般继承AbstractPhaseInterceptor<SoapMessage>类。
实例:用户验证
客户端拦截器:
package util;
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
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;
public class AuthInterpectorClient extends AbstractPhaseInterceptor<SoapMessage>
{
public AuthInterpector() {
super(Phase.PREPARE_SEND);//其父类的构造方法需要接受一个字符串,通过Phase的静态字段指定具
} //体的拦截时间
@Override
public void handleMessage(SoapMessage arg0) throws Fault {//复写方法
List<Header> headers=arg0.getHeaders();
Document doc=DOMUtils.createDocument(); //在这里我们只能通过Dom的方式生成
Element userId= doc.createElement("userId");
userId.setTextContent("userId");
Element userPass=doc.createElement("userPass");
userPass.setTextContent("userPass");
Element user=doc.createElement("user");
user.appendChild(userPass);
user.appendChild(userId);
headers.add(new Header(new QName("a"),user));
}
}
添加拦截器:
Helloworld hw=new Helloworld();
interf.Helloworld h=hw.getHelloWorldImplPort();
Client client= ClientProxy.getClient(h);
client.getOutInterceptors().add(new AuthInterpector());
System.out.println(h.sayHello("zhangsan----"));
System.out.println(h.getCat()+"====cat====");
服务端:
import java.util.List;
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.Element;
public class AuthInInterceptorServer extends AbstractPhaseInterceptor<SoapMessage>{
public AuthInInterceptor()
{
super(Phase.PRE_INVOKE);
}
public void handleMessage(SoapMessage soap) throws Fault {
List<Header> headers = soap.getHeaders();
if(headers==null || headers.size()==0)
{
System.out.println("fault -----------------------");
}
System.out.println(headers.size()+"=====================");
Header fh=headers.get(0);
Element e=(Element) fh.getObject();//将header转化为元素
String userId=e.getElementsByTagName("userId").item(0).getTextContent();
String userPass=e.getElementsByTagName("userPass").item(0).getTextContent();
if(!userId.equals("userId") && !userPass.equals("userPass"))
{
System.out.println("fault ===================");
}
}
}
添加拦截器:
Helloworld hw=new HelloWorldImpl();
EndpointImpl el= (EndpointImpl) Endpoint.publish("http://localhost:1111/helloworld", hw);
el.getInInterceptors().add(new AuthInInterceptor());
el.getOutInterceptors().add(new LoggingInInterceptor());
System.out.println("public sucess");
CXF拦截器