CXF自定义拦截器的使用

来源:互联网 发布:小米手环抢购软件 编辑:程序博客网 时间:2024/06/13 13:42

首先,我们先准备好终端的接口和实现类

package com.webservice.ws;import javax.jws.WebMethod;import javax.jws.WebService;@WebServicepublic interface HelloWS {    @WebMethod        public String sayHello(String name);}


实现类:

  

package com.webservice.ws;import javax.jws.WebService;@WebServicepublic class HelloWSImple implements HelloWS {@Overridepublic String sayHello(String name) {System.out.println("终端接口实现");return "Hello,"+name;}}

终端写完后,我们开始写服务器拦截器的代码,我们通过一个用户名和密码进行校验:

package com.webservice.interceptor;import javax.xml.namespace.QName;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;/** * 服务器端拦截器进行校验 * @author yxs * */public class CheckUserInterceptor extends AbstractPhaseInterceptor<SoapMessage>{public CheckUserInterceptor() {super(Phase.PRE_PROTOCOL);}@Overridepublic void handleMessage(SoapMessage message) throws Fault {     Header header=message.getHeader(new QName("Student"));  if(header!=null){  Element Student=(Element)header.getObject();  String name=Student.getElementsByTagName("name").item(0).getTextContent();  String password=Student.getElementsByTagName("password").item(0).getTextContent();  if("scott".equals(name)&&"123456".equals(password)){  System.out.println("服务器端拦截器通过....");  return;  }      }  System.out.println("服务器端拦截器没有通过....");  throw new Fault(new RuntimeException("请求需要一个正确的用户名和密码!"));}}

然后我们开始发布服务器端的代码:

package com.webservice.server;import java.util.List;import javax.xml.ws.Endpoint;import org.apache.cxf.interceptor.Interceptor;import org.apache.cxf.jaxws22.EndpointImpl;import org.apache.cxf.message.Message;import com.webservice.interceptor.CheckUserInterceptor;import com.webservice.ws.HelloWSImple;public class WbTest {      public static void main(String[] args) {String address="http://localhost:8080/WebserviceDemo/helloWorld";      Endpoint endpoint = Endpoint.publish(address, new HelloWSImple());      System.out.println(endpoint);      EndpointImpl endpointImpl=(EndpointImpl)endpoint;            List<Interceptor<? extends Message>> inInterceptors = endpointImpl.getInInterceptors();      inInterceptors.add(new CheckUserInterceptor());                  System.out.println("发布webservice成功");}}


接下来,我们需要通过cxf的wsdl2java生成客户端代码:


客户端代码生成后,我们就开始写客户端拦截器了:

package com.webservice.ws.interceptor;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.interceptor.Fault;import org.apache.cxf.phase.AbstractPhaseInterceptor;import org.apache.cxf.phase.Phase;import org.apache.xml.utils.DOMHelper;import org.w3c.dom.Document;import org.w3c.dom.Element;/** * 客户端拦截器 * @author yxs * */public class AddUserInterceptor extends AbstractPhaseInterceptor<SoapMessage>{private String name;private String password;public AddUserInterceptor(String name,String password) {super(Phase.PRE_PROTOCOL);//准备协议时拦截this.name=name;this.password=password;}/* <Envelope> <head> <Student> <name>scott</name> <password>123456</password> </Student> <Student> <name>scott</name> <password>123456</password> </Student> <head> <Body> <sayHello> <arg0>scott</arg0> <sayHello> </Body> </Envelope> */@SuppressWarnings("deprecation")public void handleMessage(SoapMessage msg) throws Fault {List<Header> headers = msg.getHeaders();/** * <Student> <name>scott</name> <password>123456</password> </Student> */Document docuemnt= DOMHelper.createDocument();Element rootEle = docuemnt.createElement("Student");Element nameEle= docuemnt.createElement("name");nameEle.setTextContent(name);rootEle.appendChild(nameEle);Element passwordEle= docuemnt.createElement("password");passwordEle.setTextContent(password);rootEle.appendChild(passwordEle);headers.add(new Header(new QName("Student"), rootEle));System.out.println("客户端拦截器............");}}

拦截器写完后,我就开始写客户端的调用代码了:

package com.webservice.ws.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 com.webservice.ws.HelloWS;import com.webservice.ws.HelloWSImpleService;import com.webservice.ws.interceptor.AddUserInterceptor;public class ClientTest {         public static void main(String[] args) {         HelloWSImpleService factory=new HelloWSImpleService(); HelloWS helloWSImplePort = factory.getHelloWSImplePort();         Client client = ClientProxy.getClient(helloWSImplePort);         List<Interceptor<? extends Message>> outInterceptors = client.getOutInterceptors();         outInterceptors.add(new AddUserInterceptor("scott","123456"));         String info=helloWSImplePort.sayHello("mike");         System.out.println("client:"+info);              System.out.println("client===================");         }}

ok,大功告成。




0 0
原创粉丝点击