CXF自定义拦截器的使用
2015-09-04 22:57
399 查看
首先,我们先准备好终端的接口和实现类
实现类:
终端写完后,我们开始写服务器拦截器的代码,我们通过一个用户名和密码进行校验:
然后我们开始发布服务器端的代码:
接下来,我们需要通过cxf的wsdl2java生成客户端代码:
客户端代码生成后,我们就开始写客户端拦截器了:
拦截器写完后,我就开始写客户端的调用代码了:
ok,大功告成。
package com.webservice.ws; import javax.jws.WebMethod; import javax.jws.WebService; @WebService public interface HelloWS { @WebMethod public String sayHello(String name); }
实现类:
package com.webservice.ws; import javax.jws.WebService; @WebService public class HelloWSImple implements HelloWS { @Override public 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); } @Override public 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,大功告成。
相关文章推荐
- 如何查看linux系统是32位还是64位
- 【转】c#引用类型与值类型的区别大盘点
- MySQL(十二)之数据备份命令mysqldump
- UC/OS II 任务管理(2)之就绪表和就绪组
- PhotoView源码分析(2)
- 8051汇编命令记录。
- hdu 1551 Cable master(二分法)
- 市面上需要关注的物联网操作系统
- Device eth0 does not seem to be present,delaying initialization.
- expect
- 域传送漏洞总结
- 机器学习实战Logistic回归笔记
- 我看原型链
- Leetcode229 Majority Element II
- C++标准库笔记之一 Chapter 3 New Language Features
- HDU 5035 Delivery (2014年北京赛区网络赛D题)
- Android之Thread与Service
- mongodb学习04 操作详解(2)
- KVC的步骤 以及重点
- xml的增,删,改,查