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

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

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

一、拦截器实现

1、拦截器的代码实现

public class HelloInInterceptor extends AbstractPhaseInterceptor {

	public HelloInInterceptor(String phase) {
		super(phase);
	}
	
	public HelloInInterceptor() {
		super(Phase.RECEIVE);
	}

	/** <功能详细描述>
	 * 创 建 人:  XX
	 * 创建时间:  2012-9-28 下午02:34:07  
	 * @param arg0
	 * @throws Fault
	 * @see [类、类#方法、类#成员]
	 */
	public void handleMessage(Message message) throws Fault {
		System.out.println("*********In****Helloworld******");
	}

}

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

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



	
	
	
	

	
	
	
	
	

   
	
		
	   
	      
	      
	   
	   
	   
	      
	   
	   
	      
	   
	   
	   
		
	
	
	
		
		   
		
		
		    
		
		
			
		
		
			
			
		
		
			
		
	

	
	
	
		
		
	

注意:修改的代码如下:


		
	   
	      
	      
	   
	   
	   
	      
	   
	   
	      
	   
	   
	   
		
	

二、多拦截器的捆绑

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

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

具体实现如下:

1、

public class HelloWorldFeature extends AbstractFeature {

	@Override
	protected void initializeProvider(InterceptorProvider provider, Bus bus) {
		provider.getInInterceptors().add(new LoggingInInterceptor());
		provider.getInInterceptors().add(new HelloInInterceptor());
		provider.getOutInterceptors().add(new LoggingOutInterceptor());
	}
}

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

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

   	
	  
			
		 
		
	   
	      
	   
	   
	
  

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