`

CXF之四(拦截器(Interceptor)

    博客分类:
  • SOA
 
阅读更多

Interceptor是CXF架构中一个重要的功能。你可以在不对核心模块进行修改的情况下,动态添加很多功能(你可以想象Struts2拦截器的优点)。这对于CXF这个以处理消息为中心的服务框架来说是非常有用的,CXF通过在Interceptor中对消息进行特殊处理,实现了很多重要功能模块,例如:日志记录,Soap消息处理,消息的压缩处理。

      CXF已经实现了很多种拦截器,很多已经在发布、访问Web 服务时已经默认添加到拦截器链。一般情况下, 我们自己的拦截器只要继承AbstractPhaseInterceptor<T extends org.apache.cxf.message.Message>类即可,这个类可以指定继承它的拦截器在什么阶段被启用,阶段属性可以通过org.apache.cxf.phase.Phase 中的常量指定值。

 

下面简单通过实例来表述一下CXF拦截器功能;

 

一、拦截器实现

 

1、拦截器的代码实现

 

 

Java代码  收藏代码
  1. public class HelloInInterceptor extends AbstractPhaseInterceptor<Message> {  
  2.   
  3.     public HelloInInterceptor(String phase) {  
  4.         super(phase);  
  5.     }  
  6.       
  7.     public HelloInInterceptor() {  
  8.         super(Phase.RECEIVE);  
  9.     }  
  10.   
  11.     /** <功能详细描述> 
  12.      * 创 建 人:  XX 
  13.      * 创建时间:  2012-9-28 下午02:34:07   
  14.      * @param arg0 
  15.      * @throws Fault 
  16.      * @see [类、类#方法、类#成员] 
  17.      */  
  18.     public void handleMessage(Message message) throws Fault {  
  19.         System.out.println("*********In****Helloworld******");  
  20.     }  
  21.   
  22. }  

 

 

注意:你要注意CXF 中的拦截器编写时不要只针对服务端或者客户端,应该是两者均可使用,另外名字要见名知意。例如:使用In、Out 标注这是一个输入时起作用还是输出时起作用的拦截器。上面的HelloInInterceptor由于在构造方法中指定在接收消息阶段有效,所以即使你把它注册到OutInterceptor 的集合中也无效。

 

2、在Spring对自定义拦截器的配置

 

 

Java代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:jaxws="http://cxf.apache.org/jaxws"  
  5.     xmlns:jaxrs="http://cxf.apache.org/jaxrs"  
  6.     xsi:schemaLocation=" http://www.springframework.org/schema/beans                       
  7.                     http://www.springframework.org/schema/beans/spring-beans.xsd                         
  8.                     http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd  
  9.                     http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">  
  10.     <import resource="classpath:META-INF/cxf/cxf.xml" />  
  11.     <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />  
  12.     <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />  
  13.       
  14.   
  15.     <bean id="inMessageInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" />  
  16.     <bean id="outMessageInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>  
  17.       
  18.     <bean id="helloInInterceptor" class="com.exp.service.outer.interceptor.HelloInInterceptor"/>  
  19.       
  20.   
  21.    <!--id:名称(随意配),implementor:指定接口具体实现类,address:随意配-->  
  22.     <jaxws:endpoint id="helloWorld"  implementor="#HelloWorldImpl" address="/HelloWorld"  >  
  23.         <!-- 输入日志拦截器 -->  
  24.        <jaxws:inInterceptors>  
  25.           <ref bean="inMessageInterceptor"/>  
  26.           <ref bean="helloInInterceptor"/>  
  27.        </jaxws:inInterceptors>  
  28.        <!-- 输出日志拦截器 -->  
  29.        <jaxws:outInterceptors>  
  30.           <ref bean="outMessageInterceptor"/>  
  31.        </jaxws:outInterceptors>  
  32.        <jaxws:properties>  
  33.           <entry key="mtom_enabled" value="true"></entry>  
  34.        </jaxws:properties>  
  35.          
  36.        <!--   
  37.        <jaxws:features>  
  38.             <bean class="com.exp.service.outer.interceptor.HelloWorldFeature"></bean>  
  39.         </jaxws:features> -->  
  40.           
  41.     </jaxws:endpoint>  
  42.       
  43.     <jaxrs:server id="rest_HelloWorld" address="/">  
  44.         <jaxrs:inInterceptors>  
  45.            <ref bean="inMessageInterceptor"/>  
  46.         </jaxrs:inInterceptors>  
  47.         <jaxrs:outInterceptors>  
  48.             <ref bean="outMessageInterceptor"/>  
  49.         </jaxrs:outInterceptors>  
  50.         <jaxrs:serviceBeans>  
  51.             <ref bean="rest_HelloWorldImpl" />  
  52.         </jaxrs:serviceBeans>  
  53.         <jaxrs:extensionMappings>  
  54.             <entry key="json" value="application/json" />  
  55.             <entry key="xml" value="application/xml" />  
  56.         </jaxrs:extensionMappings>  
  57.         <jaxrs:languageMappings>  
  58.             <entry key="en" value="en-gb" />  
  59.         </jaxrs:languageMappings>  
  60.     </jaxrs:server>  
  61.   
  62.     <!-- WebService 客户端 spring 配置文件cxf与Spring集成,cxf里提供了一个工厂类org.apache.cxf.jaxws.JaxWsProxyFactoryBean,  
  63.     可以方便实现的调用WebService。serviceClass属性是接口类,address是webService的路径在其他bean里如果要调用webservice,  
  64.     只要将client这个bean注入到需要使用的bean里。-->  
  65.     <bean id="client" class="com.exp.service.outer.HelloWorld" factory-bean="clientFactory" factory-method="create" />  
  66.     <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">  
  67.         <property name="serviceClass" value="com.exp.service.outer.HelloWorld" />  
  68.         <property name="address" value="http://localhost:8080/demo/webservice/HelloWorld" />  
  69.     </bean>  
  70. </beans>  

 

 

注意:修改的代码如下:

 

Java代码  收藏代码
  1. <jaxws:endpoint id="helloWorld"  implementor="#HelloWorldImpl" address="/HelloWorld"  >  
  2.         <!-- 输入日志拦截器 -->  
  3.        <jaxws:inInterceptors>  
  4.           <ref bean="inMessageInterceptor"/>  
  5.           <ref bean="helloInInterceptor"/>  
  6.        </jaxws:inInterceptors>  
  7.        <!-- 输出日志拦截器 -->  
  8.        <jaxws:outInterceptors>  
  9.           <ref bean="outMessageInterceptor"/>  
  10.        </jaxws:outInterceptors>  
  11.        <jaxws:properties>  
  12.           <entry key="mtom_enabled" value="true"></entry>  
  13.        </jaxws:properties>  
  14.          
  15.        <!--   
  16.        <jaxws:features>  
  17.             <bean class="com.exp.service.outer.interceptor.HelloWorldFeature"></bean>  
  18.         </jaxws:features> -->  
  19.           
  20.     </jaxws:endpoint>  

 

 

 

二、多拦截器的捆绑

 

   由于不光CXF内置有拦截器,而且还可以自定义拦截器。这样WebServcie的SEI可能配置多个、一大堆拦截器,这样很不方便。在Struts2中可以自定义拦截器,他还提供了自定义拦截器堆栈的功能,将多个拦截器捆绑在一起使用。这样不必要一个一个的去注册拦截器。在CXF中也有类似功能,可以将拦截器捆绑在一起,你就可以将它注册到你要使用的地方,而不必一个一个拦截器的注册使用。

   实现拦截器的捆绑过程非常的简单,继承AbstractFeature 类来实现一个新的特征, 只需要覆盖initializeProvider 方法即可。其实Feature 就是将一组拦截器放在其中,然后一并注册使用。

 

具体实现如下:

1、

 

 

Java代码  收藏代码
  1. public class HelloWorldFeature extends AbstractFeature {  
  2.   
  3.     @Override  
  4.     protected void initializeProvider(InterceptorProvider provider, Bus bus) {  
  5.         provider.getInInterceptors().add(new LoggingInInterceptor());  
  6.         provider.getInInterceptors().add(new HelloInInterceptor());  
  7.         provider.getOutInterceptors().add(new LoggingOutInterceptor());  
  8.     }  
  9. }  

 

 

 

 注意:能够看到通过HelloWorldFeature.java捆绑了三个拦截器。

 

2、在Spring对捆绑拦截器的配置

 

 

Java代码  收藏代码
  1.     <jaxws:endpoint id="helloWorld" implementor="#HelloWorldImpl" address="/HelloWorld" >  
  2. <jaxws:features>  
  3. <bean class="com.exp.service.outer.interceptor.HelloWorldFeature"></bean>  
  4. lt;/jaxws:features>   
  5.   
  6.  <jaxws:properties>  
  7.     <entry key="mtom_enabled" value="true"></entry>  
  8.  </jaxws:properties>  
  9.    
  10. t;/jaxws:endpoint>  

 

 

看到这里省掉了很多拦截器的配置代码,只需要一个 <jaxws:features>就搞定

分享到:
评论

相关推荐

    CXF拦截器(Interceptor)的使用

    标题:“CXF拦截器(Interceptor)的使用” 描述:“讲解了cxf实现拦截器的原因、核心API及使用方法” 在深入探讨CXF拦截器的使用之前,我们首先需要理解其在CXF框架中的核心作用与价值。Apache CXF是一个开源框架,...

    CXF3.0+Spring3.2 自定义拦截器

    1. **CXF拦截器基础**:CXF的拦截器是基于JAX-WS规范的Handler Chain模型,分为In-bound(请求进来时触发)和Out-bound(响应出去时触发)两类。拦截器可以通过在服务配置中指定,或者通过编程方式动态添加。 2. **...

    CXF WebService带有拦截器

    本篇文章将深入探讨如何使用CXF来开发具有权限控制功能的Web Service,并通过拦截器实现这一目标。 首先,我们需要理解Web Service拦截器的概念。在CXF中,拦截器是处理消息生命周期中的关键组件,它们可以在消息...

    11.为CXF客户端添加自定义拦截器完成权限控制

    1. **创建拦截器类**:首先,创建一个实现了`org.apache.cxf.interceptor.ClientInterceptor`接口的类。这个接口规定了`handleFault`、`aroundInvoke`和` AroundUnmarshal`等方法。其中,`aroundInvoke`方法是核心,...

    webservice的cxf框架拦截器demo

    本篇将深入探讨CXF框架中的拦截器(Interceptor)及其在"webservice的cxf框架拦截器demo"中的应用。 拦截器在CXF中是一种强大的工具,它允许开发者在消息发送或接收的过程中插入自定义的行为。这在处理认证、日志...

    CXF使用EndpointImpl发布WebService加入拦截器

    在Java世界中,Apache CXF是一个广泛使用的开源框架,它允许开发者创建和消费Web服务。在Web服务开发中,拦截器扮演着至关重要的角色,...总的来说,理解并熟练运用CXF拦截器对于任何CXF开发者来说都是一项重要的技能。

    10.为CXF服务器端添加自定义拦截器进行权限检查

    在开发基于CXF的Web服务时,为了确保系统的安全性和数据的完整性,通常需要对请求进行权限检查。本文将深入探讨如何为CXF服务器...在学习和应用这些知识时,结合实际案例和实践操作将有助于更好地掌握CXF拦截器的使用。

    CXF发布WebService加入拦截器

    CXF拦截器是一种AOP(面向切面编程)的概念,它们是执行特定任务的独立单元,可以在消息传递的生命周期中不同阶段被调用。拦截器可以用来处理如认证、授权、日志记录、性能监控、数据转换等任务,增强了服务的功能和...

    08.CXF拦截器的理论以及如何为CXF的客户端和服务器端添加拦截器

    **CXF拦截器理论与应用** 在Web服务领域,Apache CXF是一个强大的开源框架,它提供了构建和消费SOAP和RESTful服务的能力。拦截器是CXF框架中的一个重要组成部分,允许开发者在服务调用的生命周期中插入自定义逻辑,...

    webservice的cxf框架拦截器demo.rar

    在CXF服务端,你可以通过实现`org.apache.cxf.interceptor.Fault`和`org.apache.cxf.phase.PhaseInterceptorChain`接口的类来创建自定义拦截器,并将它们添加到服务的拦截器链中。 4. **“inter_client”**: 这...

    SSH2-interceptor拦截器(权限管理)

    ssh2-interceptor拦截器(权限管理).

    CXF3.1.16 +Spring4 +MyBatis + Maven自定义拦截器 WebService实例源码下载

    在CXF中,自定义拦截器可以通过实现`org.apache.cxf.interceptor.Fault`和`org.apache.cxf.phase.Phase`接口来创建。 6. **安全性考虑**:通过客户端添加header并由服务端验证的方式,可以实现基于header的安全机制...

    Cxf拦截器实例

    通过学习和理解这些示例,开发者可以更好地利用CXF拦截器来扩展和定制自己的Web服务,提高应用程序的灵活性和可维护性。无论是客户端还是服务器端,拦截器都是一个强大的工具,能够帮助我们控制和优化服务通信的每个...

    13.为CXF与Spring整合发布WebService添加拦截器进行权限控制

    首先,我们需要理解CXF拦截器的概念。拦截器是CXF提供的一种机制,它允许我们在Web服务调用的生命周期中的不同阶段插入自定义逻辑,如消息的发送和接收。这为我们提供了在服务执行前、后或过程中进行额外操作的机会...

    CXF-拦截器-权限控制-登录校验

    本文将深入探讨"CXF拦截器-权限控制-登录校验"这一主题。 首先,我们需要了解什么是拦截器。在CXF框架中,拦截器是实现业务逻辑和基础架构之间解耦的一种方式。它们可以插入到服务调用的生命周期中,在消息发送前或...

    WebService之自定义拦截器(server+client)

    1. **创建拦截器类**:继承自CXF提供的相应拦截器基类,如`org.apache.cxf.interceptor.FaultInterceptor`或`org.apache.cxf.interceptor.ClientInterceptor`。 2. **覆盖关键方法**:如`handleMessage(Message)`或`...

    CXF和Spring整合,并且添加拦截器

    **标题:“CXF和Spring整合,并且添加拦截器”** 在Java世界中,Apache CXF是一个流行的开源服务框架,用于创建和消费Web服务。它支持多种Web服务规范,包括SOAP、RESTful API以及WS-*标准。另一方面,Spring框架是...

    使用CXF Interceptor&Feature

    本篇文章将深入探讨如何利用CXF的Interceptor(拦截器)和Feature(特性)功能,提升我们的服务开发体验。 首先,Interceptor是CXF框架中的一个核心组件,它允许我们在服务调用的生命周期中插入自定义的行为。拦截...

    ip黑白名单拦截器java示例

    而"拦截器代码(可根据业务进行修改)"这部分,可能是一个Java类,它实现了拦截器接口,如Servlet的Filter或Spring框架的Interceptor。这个类会拦截每个HTTP请求,检查请求头中的`X-Forwarded-For`或`RemoteAddr`...

    WebService_CXF实现及ANT

    在这个主题中,我们将深入探讨CXF的Interceptor拦截器、处理复杂类型对象的传递以及如何结合Spring进行集成,最后我们将学习如何使用ANT工具快速构建和部署CXF工程。 1. CXF Interceptor拦截器: 拦截器是CXF框架...

Global site tag (gtag.js) - Google Analytics