你的位置:首页 > Java教程

[Java教程]Apache CXF自定义拦截器


为什么设计拦截器?
1.为了在webservice请求过程中,能动态操作请求和响应数据,CXF设计了拦截器
拦截器分类:
1.按所处的位置分:服务器端拦截器,客户端拦截器。
2.按消息的方向分:入拦截器,出拦截器。
3.按定义者分:系统拦截器,自定义拦截器。

 

客户端添加日志拦截器

package com.client.interceptor;import java.util.List;import javax.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 AddUserInterceptor extends AbstractPhaseInterceptor<SoapMessage>{  private String name;  private String password;  /**   *   * @param name   * @param password   */    public AddUserInterceptor(String name,String password) {    super(Phase.PRE_PROTOCOL);//准备协议化时拦截    // TODO Auto-generated constructor stub    this.name=name;    this.password=password;  }  @Override  public void handleMessage(SoapMessage msg) throws Fault {    // TODO Auto-generated method stub    List<Header> headers = msg.getHeaders();        Document document = DOMUtils.createDocument();    Element rootEle = document.createElement("apple");    Element nameEle = document.createElement("name");    nameEle.setTextContent(name);    rootEle.appendChild(nameEle);        Element passwordEle = document.createElement("password");    passwordEle.setTextContent(password);    rootEle.appendChild(passwordEle);        headers.add(new Header(new QName("apple"), rootEle));    System.out.println("client handMwssage()....");  }}

 

 

服务器端拦截器:

package com.service.interceptor;import javax.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 CheckUser extends AbstractPhaseInterceptor<SoapMessage>{  public CheckUser() {    super(Phase.PRE_PROTOCOL);    // TODO Auto-generated constructor stub  }      /*  <Envelope>    <head>      <apple>        <name>bo ram</name>        <password>520</password>      <apple>    </head>    <Body>      <favorite>        <arg0>Tara</arg0>      <favorite>    </Body>  </Envelope>     */      @Override  public void handleMessage(SoapMessage message) throws Fault {    // TODO Auto-generated method stub    Header header = message.getHeader(new QName("apple"));    if(header!=null){      Element appleEle=(Element) header.getObject();      String name = appleEle.getElementsByTagName("name").item(0).getTextContent();      String password = appleEle.getElementsByTagName("password").item(0).getTextContent();      if("bo ram".equals(name)&&"520".equals(password)){        System.out.println("Server 通过拦截器");        return;      }    }        System.out.println("server 没有通过拦截器。。。。。");    throw new Fault(new Exception("请求需要一个正确的用户名和密码"));  }}

 

客户端

package com.cxf_client.client;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.interceptor.LoggingInInterceptor;import org.apache.cxf.interceptor.LoggingOutInterceptor;import org.apache.cxf.message.Message;import com.client.interceptor.AddUserInterceptor;import com.client.simple3.Simple;import com.client.simple3.SimpleimplService;public class Simpleclient2 {  public static void main(String[] args) {    // TODO Auto-generated method stub      SimpleimplService simpleimplService = new SimpleimplService();       Simple simpleimplPort = simpleimplService.getSimpleimplPort();       //发送请求的客户端数据       Client client = ClientProxy.getClient(simpleimplPort);       //客户端出拦截器       List<Interceptor<? extends Message>> outInterceptors = client.getOutInterceptors();       outInterceptors.add(new AddUserInterceptor("bo ram", "520"));//       //客户端入拦截器//       List<Interceptor<? extends Message>> inInterceptors = client.getInInterceptors();//       inInterceptors.add(new LoggingInInterceptor());             String favorite = simpleimplPort.favorite("Tara");       System.out.println(favorite);        }}

 

 

 服务端

package com.service.server;import java.util.List;import javax.import org.apache.cxf.interceptor.Interceptor;import org.apache.cxf.interceptor.LoggingInInterceptor;import org.apache.cxf.interceptor.LoggingOutInterceptor;import org.apache.cxf.jaxws22.EndpointImpl;import org.apache.cxf.message.Message;import com.service.impl.Simpleimpl;import com.service.interceptor.CheckUser;public class SimpleServer2 {  public static void main(String[] args) {    // TODO Auto-generated method stub    String address="http://localhost:8848/simpleserver/simple";      Endpoint publish = Endpoint.publish(address, new Simpleimpl());      EndpointImpl endpointimpl=(EndpointImpl) publish;      //服务端入拦截器      List<Interceptor<? extends Message>> inInterceptors = endpointimpl.getInInterceptors();      inInterceptors.add(new CheckUser());//      //服务端出拦截器//      List<Interceptor<? extends Message>> outInterceptors = endpointimpl.getOutInterceptors();//      outInterceptors.add(new LoggingOutInterceptor());            System.out.println("published");  }}