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

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

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

一、拦截器实现

1、拦截器的代码实现

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

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

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

  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. <bean id="inMessageInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
  14. <bean id="outMessageInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
  15. <bean id="helloInInterceptor" class="com.exp.service.outer.interceptor.HelloInInterceptor"/>
  16. <!--id:名称(随意配),implementor:指定接口具体实现类,address:随意配-->
  17. <jaxws:endpoint id="helloWorld"  implementor="#HelloWorldImpl" address="/HelloWorld"  >
  18. <!-- 输入日志拦截器 -->
  19. <jaxws:inInterceptors>
  20. <ref bean="inMessageInterceptor"/>
  21. <ref bean="helloInInterceptor"/>
  22. </jaxws:inInterceptors>
  23. <!-- 输出日志拦截器 -->
  24. <jaxws:outInterceptors>
  25. <ref bean="outMessageInterceptor"/>
  26. </jaxws:outInterceptors>
  27. <jaxws:properties>
  28. <entry key="mtom_enabled" value="true"></entry>
  29. </jaxws:properties>
  30. <!--
  31. <jaxws:features>
  32. <bean class="com.exp.service.outer.interceptor.HelloWorldFeature"></bean>
  33. </jaxws:features> -->
  34. </jaxws:endpoint>
  35. <jaxrs:server id="rest_HelloWorld" address="/">
  36. <jaxrs:inInterceptors>
  37. <ref bean="inMessageInterceptor"/>
  38. </jaxrs:inInterceptors>
  39. <jaxrs:outInterceptors>
  40. <ref bean="outMessageInterceptor"/>
  41. </jaxrs:outInterceptors>
  42. <jaxrs:serviceBeans>
  43. <ref bean="rest_HelloWorldImpl" />
  44. </jaxrs:serviceBeans>
  45. <jaxrs:extensionMappings>
  46. <entry key="json" value="application/json" />
  47. <entry key="xml" value="application/xml" />
  48. </jaxrs:extensionMappings>
  49. <jaxrs:languageMappings>
  50. <entry key="en" value="en-gb" />
  51. </jaxrs:languageMappings>
  52. </jaxrs:server>
  53. <!-- WebService 客户端 spring 配置文件cxf与Spring集成,cxf里提供了一个工厂类org.apache.cxf.jaxws.JaxWsProxyFactoryBean,
  54. 可以方便实现的调用WebService。serviceClass属性是接口类,address是webService的路径在其他bean里如果要调用webservice,
  55. 只要将client这个bean注入到需要使用的bean里。-->
  56. <bean id="client" class="com.exp.service.outer.HelloWorld" factory-bean="clientFactory" factory-method="create" />
  57. <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
  58. <property name="serviceClass" value="com.exp.service.outer.HelloWorld" />
  59. <property name="address" value="http://localhost:8080/demo/webservice/HelloWorld" />
  60. </bean>
  61. </beans>

注意:修改的代码如下:

  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. <jaxws:features>
  16. <bean class="com.exp.service.outer.interceptor.HelloWorldFeature"></bean>
  17. </jaxws:features> -->
  18. </jaxws:endpoint>

二、多拦截器的捆绑

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

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

具体实现如下:

1、

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

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

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

  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. <jaxws:properties>
  6. <entry key="mtom_enabled" value="true"></entry>
  7. </jaxws:properties>
  8. t;/jaxws:endpoint>

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

CXF拦截器(Interceptor)LoggingInInterceptor的更多相关文章

  1. 【CXF】- 拦截器 Interceptor

    CXF拦截器 拦截动态操作请求和响应数据 拦截器分类 位置:服务器端拦截器,客户端拦截器 消息方向:入拦截器 出拦截器 定义者:系统拦截器 自定义拦截器:LoggingInInteceptor ①:创 ...

  2. Web Service学习之七:CXF拦截器

    一.用途 CXF拦截器类似Struts2的拦截器,后者是拦截和处理请求,前者是对发送和接收的sope消息进行处理,一般用于WS请求响应中的权限验证.日志记录,Soap消息处理,消息的压缩处理等: 这个 ...

  3. CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用)

    CXF拦截器使用,创建一个使用SOAPHeader的安全验证xml格式: <soap:Header> <auth:authentication xmlns:auth="ht ...

  4. struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo

    理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...

  5. struts2拦截器interceptor的三种配置方法

    1.struts2拦截器interceptor的三种配置方法 方法1. 普通配置法 <struts> <package name="struts2" extend ...

  6. SSM-SpringMVC-33:SpringMVC中拦截器Interceptor讲解

     ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 拦截器Interceptor: 对处理方法进行双向的拦截,可以对其做日志记录等 我选择的是实现Handler ...

  7. 过滤器(Filter)和拦截器(Interceptor)

    过滤器(Filter) Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序.它依赖于servlet容器,在实现上,基于函数回调,它可以对几乎所有请求 ...

  8. 二十五、过滤器Filter,监听器Listener,拦截器Interceptor的区别

    1.Servlet:运行在服务器上可以动态生成web页面.servlet的声明周期从被装入到web服务器内存,到服务器关闭结束.一般启动web服务器时会加载servelt的实例进行装入,然后初始化工作 ...

  9. Flume 拦截器(interceptor)详解

    flume 拦截器(interceptor)1.flume拦截器介绍拦截器是简单的插件式组件,设置在source和channel之间.source接收到的事件event,在写入channel之前,拦截 ...

随机推荐

  1. 【HIHOCODER 1576】 子树中的最小权值(线段树维护DFS序)

    描述 给定一棵N个节点的树,编号1~N.其中1号节点是根,并且第i个节点的权值是Vi. 针对这棵树,小Hi会询问小Ho一系列问题.每次小Hi会指定一个节点x,询问小Ho以x为根的子树中,最小的权值是多 ...

  2. XTU 二分图和网络流 练习题 J. Drainage Ditches

    J. Drainage Ditches Time Limit: 1000ms Memory Limit: 32768KB 64-bit integer IO format: %I64d      Ja ...

  3. Go切片基础

    package main import "fmt" //切片(Slice)本身没有数据,是对底层Array的一个view //不使用指针就可以改数组内容 //slice可以向后扩展 ...

  4. Eclipse安装插件长时间停留在calculating requirements and dependencies

    如果安装插件的时候,Eclipse花费了很长的时间calculating requirements and dependencies(计算需求和依赖性 ) 这个问题通常就是在点击安装之后显示" ...

  5. 【BZOJ2560】串珠子(状压DP,容斥原理)

    题意: 铭铭有n个十分漂亮的珠子和若干根颜色不同的绳子.现在铭铭想用绳子把所有的珠子连接成一个整体.现在已知所有珠子互不相同,用整数1到n编号.对于第i个珠子和第j个珠子,可以选择不用绳子连接,或者在 ...

  6. Android应用程序项目结构

    Android应用程序项目结构 [src]:JAVA源代码目录 [gen]:由系统自动生成的JAVA源码文件,不可修改,只可查看和使用 加载的和依赖的类库 [assets]:本地存储文件的一个文件夹 ...

  7. php 翻转字符串

    //方法一 function strrev_charset($string,$charset='utf-8'){ if(!is_string($string) || !mb_check_encodin ...

  8. [洛谷U22158]策划体验(树上斜率优化)(二分最优决策)

    题目背景 OL不在,Clao又在肝少*前线,他虽然觉得这个游戏的地图很烦,但是他认为地图的难度还是太低了,习习中作为策划还不够FM,于是他自己YY了一种新的地图和新的机制: 题目描述 整个地图呈树形结 ...

  9. BCD工具类(8421)

    目录 1.BCD介绍 (1)BCD码(Binary-Coded Decimal)亦称二进码十进数.用4位二进制数来表示1位十进制数中的0~9这10个数码.用二进制编码的十进制代码. (2)BCD码可分 ...

  10. Python pandas学习笔记

    参考文献:<Python金融大数据分析> #导入模块 import pandas as pd #生成dataframe df = pd.DataFrame([10,20,30,40], c ...