三、CXF对Interceptor拦截器的支持

系统 2173 0

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

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

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

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

    2011-3-18 7:34:00 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
信息: Creating Service {http:
    
      //service.hoo.com/}IHelloWorldServiceService from class com.hoo.service.IHelloWorldService
    
    
2011-3-18 7:34:00 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Outbound Message
---------------------------
ID: 1
Address: http:
    
      //localhost:9000/helloWorld
    
    
Encoding: UTF-8
Content-Type: text/xml
Headers: {SOAPAction=["
    
    
    "], Accept=[*
    
      /*]}
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>
--------------------------------------
2011-3-18 7:34:01 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Inbound Message
----------------------------
ID: 1
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {content-type=[text/xml;charset=UTF-8], Content-Length=[230], Server=[Jetty(7.2.2.v20101205)]}
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>
--------------------------------------
[result]hoojo say: Hello World 
    
  

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

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

Interceptor代码如下:

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

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

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

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

客户端调用代码:

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

三、CXF对Interceptor拦截器的支持


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论