CXF拦截器(Interceptor)LoggingInInterceptor
Interceptor是CXF架构中一个重要的功能。你可以在不对核心模块进行修改的情况下,动态添加很多功能(你可以想象Struts2拦截器的优点)。这对于CXF这个以处理消息为中心的服务框架来说是非常有用的,CXF通过在Interceptor中对消息进行特殊处理,实现了很多重要功能模块,例如:日志记录,Soap消息处理,消息的压缩处理。
CXF已经实现了很多种拦截器,很多已经在发布、访问Web 服务时已经默认添加到拦截器链。一般情况下, 我们自己的拦截器只要继承AbstractPhaseInterceptor<T extends org.apache.cxf.message.Message>类即可,这个类可以指定继承它的拦截器在什么阶段被启用,阶段属性可以通过org.apache.cxf.phase.Phase 中的常量指定值。
下面简单通过实例来表述一下CXF拦截器功能;
一、拦截器实现
1、拦截器的代码实现
- public class HelloInInterceptor extends AbstractPhaseInterceptor<Message> {
- 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对自定义拦截器的配置
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:jaxws="http://cxf.apache.org/jaxws"
- xmlns:jaxrs="http://cxf.apache.org/jaxrs"
- xsi:schemaLocation=" http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
- http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
- <import resource="classpath:META-INF/cxf/cxf.xml" />
- <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
- <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
- <bean id="inMessageInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
- <bean id="outMessageInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
- <bean id="helloInInterceptor" class="com.exp.service.outer.interceptor.HelloInInterceptor"/>
- <!--id:名称(随意配),implementor:指定接口具体实现类,address:随意配-->
- <jaxws:endpoint id="helloWorld" implementor="#HelloWorldImpl" address="/HelloWorld" >
- <!-- 输入日志拦截器 -->
- <jaxws:inInterceptors>
- <ref bean="inMessageInterceptor"/>
- <ref bean="helloInInterceptor"/>
- </jaxws:inInterceptors>
- <!-- 输出日志拦截器 -->
- <jaxws:outInterceptors>
- <ref bean="outMessageInterceptor"/>
- </jaxws:outInterceptors>
- <jaxws:properties>
- <entry key="mtom_enabled" value="true"></entry>
- </jaxws:properties>
- <!--
- <jaxws:features>
- <bean class="com.exp.service.outer.interceptor.HelloWorldFeature"></bean>
- </jaxws:features> -->
- </jaxws:endpoint>
- <jaxrs:server id="rest_HelloWorld" address="/">
- <jaxrs:inInterceptors>
- <ref bean="inMessageInterceptor"/>
- </jaxrs:inInterceptors>
- <jaxrs:outInterceptors>
- <ref bean="outMessageInterceptor"/>
- </jaxrs:outInterceptors>
- <jaxrs:serviceBeans>
- <ref bean="rest_HelloWorldImpl" />
- </jaxrs:serviceBeans>
- <jaxrs:extensionMappings>
- <entry key="json" value="application/json" />
- <entry key="xml" value="application/xml" />
- </jaxrs:extensionMappings>
- <jaxrs:languageMappings>
- <entry key="en" value="en-gb" />
- </jaxrs:languageMappings>
- </jaxrs:server>
- <!-- WebService 客户端 spring 配置文件cxf与Spring集成,cxf里提供了一个工厂类org.apache.cxf.jaxws.JaxWsProxyFactoryBean,
- 可以方便实现的调用WebService。serviceClass属性是接口类,address是webService的路径在其他bean里如果要调用webservice,
- 只要将client这个bean注入到需要使用的bean里。-->
- <bean id="client" class="com.exp.service.outer.HelloWorld" factory-bean="clientFactory" factory-method="create" />
- <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
- <property name="serviceClass" value="com.exp.service.outer.HelloWorld" />
- <property name="address" value="http://localhost:8080/demo/webservice/HelloWorld" />
- </bean>
- </beans>
注意:修改的代码如下:
- <jaxws:endpoint id="helloWorld" implementor="#HelloWorldImpl" address="/HelloWorld" >
- <!-- 输入日志拦截器 -->
- <jaxws:inInterceptors>
- <ref bean="inMessageInterceptor"/>
- <ref bean="helloInInterceptor"/>
- </jaxws:inInterceptors>
- <!-- 输出日志拦截器 -->
- <jaxws:outInterceptors>
- <ref bean="outMessageInterceptor"/>
- </jaxws:outInterceptors>
- <jaxws:properties>
- <entry key="mtom_enabled" value="true"></entry>
- </jaxws:properties>
- <!--
- <jaxws:features>
- <bean class="com.exp.service.outer.interceptor.HelloWorldFeature"></bean>
- </jaxws:features> -->
- </jaxws:endpoint>
二、多拦截器的捆绑
由于不光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对捆绑拦截器的配置
- <jaxws:endpoint id="helloWorld" implementor="#HelloWorldImpl" address="/HelloWorld" >
- <jaxws:features>
- <bean class="com.exp.service.outer.interceptor.HelloWorldFeature"></bean>
- lt;/jaxws:features>
- <jaxws:properties>
- <entry key="mtom_enabled" value="true"></entry>
- </jaxws:properties>
- t;/jaxws:endpoint>
看到这里省掉了很多拦截器的配置代码,只需要一个 <jaxws:features>就搞定
CXF拦截器(Interceptor)LoggingInInterceptor的更多相关文章
- 【CXF】- 拦截器 Interceptor
CXF拦截器 拦截动态操作请求和响应数据 拦截器分类 位置:服务器端拦截器,客户端拦截器 消息方向:入拦截器 出拦截器 定义者:系统拦截器 自定义拦截器:LoggingInInteceptor ①:创 ...
- Web Service学习之七:CXF拦截器
一.用途 CXF拦截器类似Struts2的拦截器,后者是拦截和处理请求,前者是对发送和接收的sope消息进行处理,一般用于WS请求响应中的权限验证.日志记录,Soap消息处理,消息的压缩处理等: 这个 ...
- CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用)
CXF拦截器使用,创建一个使用SOAPHeader的安全验证xml格式: <soap:Header> <auth:authentication xmlns:auth="ht ...
- struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo
理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...
- struts2拦截器interceptor的三种配置方法
1.struts2拦截器interceptor的三种配置方法 方法1. 普通配置法 <struts> <package name="struts2" extend ...
- SSM-SpringMVC-33:SpringMVC中拦截器Interceptor讲解
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 拦截器Interceptor: 对处理方法进行双向的拦截,可以对其做日志记录等 我选择的是实现Handler ...
- 过滤器(Filter)和拦截器(Interceptor)
过滤器(Filter) Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序.它依赖于servlet容器,在实现上,基于函数回调,它可以对几乎所有请求 ...
- 二十五、过滤器Filter,监听器Listener,拦截器Interceptor的区别
1.Servlet:运行在服务器上可以动态生成web页面.servlet的声明周期从被装入到web服务器内存,到服务器关闭结束.一般启动web服务器时会加载servelt的实例进行装入,然后初始化工作 ...
- Flume 拦截器(interceptor)详解
flume 拦截器(interceptor)1.flume拦截器介绍拦截器是简单的插件式组件,设置在source和channel之间.source接收到的事件event,在写入channel之前,拦截 ...
随机推荐
- 基于flask的网页聊天室(二)
基于flask的网页聊天室(二) 前言 接上一次的内容继续完善,今天完成的内容不是很多,只是简单的用户注册登录,内容具体如下 具体内容 这次要加入与数据哭交互的操作,所以首先要建立相关表结构,这里使用 ...
- LeetCode(80)Remove Duplicates from Sorted Array II
题目 Follow up for "Remove Duplicates": What if duplicates are allowed at most twice? For ex ...
- 最近的一些JAVA基础知识
1,关于判断两个值是否相等 equal 和==是有区别到 2,判断一个数组集合 List是否为空 这个不能用"==null或者equal"要用isEmpty() , 对于不等于加一 ...
- 发布tomcate时报A configuration error occurred during startup.please verify the preference field with the prompat:null
发布tomcate时报A configuration error occurred during startup.please verify the preference field with the ...
- cf837d Round Subset
设dp[i][j][k]表示前i个数中选j个并且因子含有k个2的能获得的最多的5的个数 则dp[i][j][k]=max(dp[i-1][j][k],dp[i-1][j-1][k-cnt2]+cnt5 ...
- Sublime Text 3使用方法
一.下载安装 Sbulime Text 3官网 参考网站:http://lucida.me/blog/sublime-text-complete-guide/注意在安装时勾选Add to expl ...
- NYOJ 237 游戏高手的烦恼
游戏高手的烦恼时间限制:1000 ms | 内存限制:65535 KB难度:5描述有一位传说级游戏高手,在闲暇时间里玩起了一个小游戏,游戏中,一个n*n的方块形区域里有许多敌人,玩家可以使用炸弹炸掉某 ...
- 【CSS】position relative 用法
Relative是position的一个属性,是相对定位. position的默认值是static,(也就是说对于任意一个元素,如果没有定义它的position属性,那么它的position:stat ...
- dispatching(bzoj 2008)
Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个上级. ...
- xth 砍树(codevs 1369)
题目描述 Description 在一个凉爽的夏夜,xth 和 rabbit 来到花园里砍树.为啥米要砍树呢?是这样滴,小菜儿的儿子窄森要出生了.Xth这个做伯伯的自然要做点什么.于是他决定带着rab ...