前面在Axis中介绍过Axis的Handler,这里CXF的Interceptor就和Handler的功能类似。在每个请求响应之前或响应之后,做一些事情。这里的Interceptor就和Filter、Struts的Interceptor很类似,提供它的主要作用就是为了很好的降低代码的耦合性,提供代码的内聚性。下面我们就看看CXF的Interceptor是怎么样工作的。

1、 我们就用上面的HelloWorldService,客户端的调用代码重新写一份,代码如下:

  1. package com.hoo.client;
  1.  
  1. import org.apache.cxf.interceptor.LoggingInInterceptor;
  1. import org.apache.cxf.interceptor.LoggingOutInterceptor;
  1. import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
  1. import org.apache.cxf.phase.Phase;
  1. import com.hoo.interceptor.MessageInterceptor;
  1. import com.hoo.service.IHelloWorldService;
  1.  
  1. /**
  1. * <b>function:</b>CXF WebService客户端调用代码
  1. * @author hoojo
  1. * @createDate 2011-3-16 上午09:03:49
  1. * @file HelloWorldServiceClient.java
  1. * @package com.hoo.client
  1. * @project CXFWebService
  1. * @blog http://blog.csdn.net/IBM_hoojo
  1. * @email hoojo_@126.com
  1. * @version 1.0
  1. */
  1. public class ServiceMessageInterceperClient {
  1. public static void main(String[] args) {
  1. //调用WebService
  1. JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
  1. factory.setServiceClass(IHelloWorldService.class);
  1. factory.setAddress("http://localhost:9000/helloWorld");
  1. factory.getInInterceptors().add(new LoggingInInterceptor());
  1. factory.getOutInterceptors().add(new LoggingOutInterceptor());
  1. IHelloWorldService service = (IHelloWorldService) factory.create();
  1. System.out.println("[result]" + service.sayHello("hoojo"));
  1. }
  1. }

上面的CXF的拦截器是添加在客户端,同样在服务器端也是可以添加拦截器Interceptor的。运行后结果如下:

  1. 2011-3-18 7:34:00 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
  2. 信息: Creating Service {http://service.hoo.com/}IHelloWorldServiceService from class com.hoo.service.IHelloWorldService
  3. 2011-3-18 7:34:00 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
  4. 信息: Outbound Message
  5. ---------------------------
  6. ID: 1
  7. Address: http://localhost:9000/helloWorld
  8. Encoding: UTF-8
  9. Content-Type: text/xml
  10. Headers: {SOAPAction=[""], Accept=[*/*]}
  11. Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:sayHello xmlns:ns1="http://service.hoo.com/"><name>hoojo</name></ns1:sayHello></soap:Body></soap:Envelope>
  12. --------------------------------------
  13. 2011-3-18 7:34:01 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
  14. 信息: Inbound Message
  15. ----------------------------
  16. ID: 1
  17. Response-Code: 200
  18. Encoding: UTF-8
  19. Content-Type: text/xml;charset=UTF-8
  20. Headers: {content-type=[text/xml;charset=UTF-8], Content-Length=[230], Server=[Jetty(7.2.2.v20101205)]}
  21. Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:sayHelloResponse xmlns:ns1="http://service.hoo.com/"><return>hoojo say: Hello World </return></ns1:sayHelloResponse></soap:Body></soap:Envelope>
  22. --------------------------------------
  23. [result]hoojo say: Hello World

上面的部分信息是LoggingInterceptor输出的日志信息,分别在请求和响应的时候输出日志信息,还有输出请求的时候参数的信息以及响应的时候返回值的信息。

2、 刚才是客户端添加Interceptor,现在我们自己编写一个Interceptor,这个Interceptor需要继承AbstractPhaseInterceptor,实现handleMessage和一个带参数的构造函数。然后在服务器端添加这个Interceptor。

Interceptor代码如下:

  1. package com.hoo.interceptor;
  1.  
  1. import org.apache.cxf.interceptor.Fault;
  1. import org.apache.cxf.message.Message;
  1. import org.apache.cxf.phase.AbstractPhaseInterceptor;
  1.  
  1. /**
  1. * <b>function:</b> 自定义消息拦截器
  1. * @author hoojo
  1. * @createDate Mar 17, 2011 8:10:49 PM
  1. * @file MessageInterceptor.java
  1. * @package com.hoo.interceptor
  1. * @project CXFWebService
  1. * @blog http://blog.csdn.net/IBM_hoojo
  1. * @email hoojo_@126.com
  1. * @version 1.0
  1. */
  1. public class MessageInterceptor extends AbstractPhaseInterceptor<Message> {
  1. //至少要一个带参的构造函数
  1. public MessageInterceptor(String phase) {
  1. super(phase);
  1. }
  1.  
  1. public void handleMessage(Message message) throws Fault {
  1. System.out.println("############handleMessage##########");
  1. System.out.println(message);
  1. if (message.getDestination() != null) {
  1. System.out.println(message.getId() + "#" + message.getDestination().getMessageObserver());
  1. }
  1. if (message.getExchange() != null) {
  1. System.out.println(message.getExchange().getInMessage() + "#" + message.getExchange().getInFaultMessage());
  1. System.out.println(message.getExchange().getOutMessage() + "#" + message.getExchange().getOutFaultMessage());
  1. }
  1. }
  1. }

下面看看发布服务和添加自定义拦截器的代码:

  1. package com.hoo.service.deploy;
  1.  
  1. import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
  1. import org.apache.cxf.phase.Phase;
  1. import com.hoo.interceptor.MessageInterceptor;
  1. import com.hoo.service.HelloWorldService;
  1.  
  1. /**
  1. * <b>function:</b>在服务器发布自定义的Interceptor
  1. * @author hoojo
  1. * @createDate 2011-3-18 上午07:38:28
  1. * @file DeployInterceptorService.java
  1. * @package com.hoo.service.deploy
  1. * @project CXFWebService
  1. * @blog http://blog.csdn.net/IBM_hoojo
  1. * @email hoojo_@126.com
  1. * @version 1.0
  1. */
  1. public class DeployInterceptorService {
  1.  
  1. public static void main(String[] args) throws InterruptedException {
  1. //发布WebService
  1. JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
  1. //设置Service Class
  1. factory.setServiceClass(HelloWorldService.class);
  1. factory.setAddress("http://localhost:9000/helloWorld");
  1. //设置ServiceBean对象
  1. factory.setServiceBean(new HelloWorldService());
  1. //添加请求和响应的拦截器,Phase.RECEIVE只对In有效,Phase.SEND只对Out有效
  1. factory.getInInterceptors().add(new MessageInterceptor(Phase.RECEIVE));
  1. factory.getOutInterceptors().add(new MessageInterceptor(Phase.SEND));
  1. factory.create();
  1. System.out.println("Server start ......");
  1. Thread.sleep(1000 * 60);
  1. System.exit(0);
  1. System.out.println("Server exit ");
  1. }
  1. }

值得说的是,以前发布WebService是用Endpoint的push方法。这里用的是JaxWsServerFactoryBean和客户端调用的代码JaxWsProxyFactoryBean有点不同。

客户端调用代码:

  1. package com.hoo.client;
  1.  
  1. import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
  1. import com.hoo.service.IHelloWorldService;
  1.  
  1. /**
  1. * <b>function:</b>CXF WebService客户端调用代码
  1. * @author hoojo
  1. * @createDate 2011-3-16 上午09:03:49
  1. * @file HelloWorldServiceClient.java
  1. * @package com.hoo.client
  1. * @project CXFWebService
  1. * @blog http://blog.csdn.net/IBM_hoojo
  1. * @email hoojo_@126.com
  1. * @version 1.0
  1. */
  1. public class HelloWorldServiceClient {
  1. public static void main(String[] args) {
  1. //调用WebService
  1. JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
  1. factory.setServiceClass(IHelloWorldService.class);
  1. factory.setAddress("http://localhost:9000/helloWorld");
  1. IHelloWorldService service = (IHelloWorldService) factory.create();
  1. System.out.println("[result]" + service.sayHello("hoojo"));
  1. }
  1. }

CXF对Interceptor拦截器的支持的更多相关文章

  1. CXF实战之拦截器Interceptor(四)

    拦截器(Interceptor)是CXF功能最基本的扩展点,能够在不正确核心模块进行改动的情况下.动态加入非常多功能.拦截器和JAX-WS Handler.Filter的功能相似,当服务被调用时.就会 ...

  2. SpringMVC中使用Interceptor拦截器

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...

  3. Spring MVC中使用Interceptor拦截器

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...

  4. SpringMVC 中的Interceptor 拦截器

    1.配置拦截器 在springMVC.xml配置文件增加: <mvc:interceptors>  <!-- 日志拦截器 -->  <mvc:interceptor> ...

  5. SpringMVC中的Interceptor拦截器及与Filter区别

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...

  6. [转]SpringMVC中使用Interceptor拦截器

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...

  7. SpringMVC之七:SpringMVC中使用Interceptor拦截器

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...

  8. Spring中的Interceptor 拦截器 专题

    spring-webmvc-4.3.14.RELEASE.jar org.springframework.web.servlet.DispatcherServlet#doDispatch /** * ...

  9. SpringMvc中Interceptor拦截器用法

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆等. 一. 使用场景 1 ...

随机推荐

  1. python语言中的AOP利器:装饰器

    一.前言 面向切面编程(AOP)是一种编程思想,与OOP并不矛盾,只是它们的关注点相同.面向对象的目的在于抽象和管理,而面向切面的目的在于解耦和复用. 举两个大家都接触过的AOP的例子: 1)java ...

  2. 基于am3358的蜂鸣器测试

    #include <sys/ioctl.h> #include<stdio.h> #include <fcntl.h> #include <sys/types ...

  3. freemarker自定义标签报错(二)

    freemarker自定义标签 1.错误描述 freemarker.core.ParseException: Unexpected end of file reached. at freemarker ...

  4. CSS3的[att$=val]选择器

    1.实例源码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  5. nested exception is java.sql.SQLException: IO 错误

    1.错误描述 (mx.messaging.messages::ErrorMessage)#0 body = (null) clientId = "18CE3B03-9709-9DA8-763 ...

  6. 芝麻HTTP:一个采集系统的构建

    整个系统: 采集系统:

  7. Linux之23个重要命令

    作为工作几年的Linux运维老司机,总结了Linux命令行的常用的一些用法,希望对您有所收获. 1. 搜索 在vi和vim中如果打开一个很大的文件,不容易找到对应的内容,可以使用自带的搜索关键字进行搜 ...

  8. JavaScript保留关键字2。

    一些不做解释的关键字是在js中预留的东西. abstract 抽象  . arguments  参数 标识符arguments是指向实参对象的引用,实参对象是一个类数组对象. boolean 布尔值. ...

  9. [HAOI2012]高速公路

    题面在这里 题意 维护区间加操作+询问区间任选两不同点途中线段权值之和的期望 sol 一道假的期望题... 因为所有事件的发生概率都相同,所以答案就是所有方案的权值总和/总方案数 因为区间加法自然想到 ...

  10. [BZOJ1657] [Usaco2006 Mar] Mooo 奶牛的歌声 (单调栈)

    Description Farmer John's N (1 <= N <= 50,000) cows are standing in a very straight row and mo ...