首页 > 代码库 > 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拦截器