CXF实战之拦截器Interceptor(四)
拦截器(Interceptor)是CXF功能最基本的扩展点,能够在不正确核心模块进行改动的情况下。动态加入非常多功能。拦截器和JAX-WS Handler、Filter的功能相似,当服务被调用时。就会创建一个拦截器链(Interceptor Chain),拦截器链在服务输入(IN)或输出(OUT)阶段实现附加功能。
拦截器能够在client,也能够在服务端加入。当client发起一个WebService请求时。在client会创建输出拦截器链,服务端接收到client的后。会创建输入拦截器链。当服务端返回响应消息时,响应消息会经过服务端的输出拦截链。client接收到服务端的响应时。会创建输入拦截器链,响应消息先经过输入拦截器链处理。拦截器在服务端和client的作用如图所看到的。
拦截器链阶段
拦截器链有多个阶段,每一个阶段都有多个拦截器。拦截器在拦截器链的哪个阶段起作用。能够在拦截器的构造函数中声明。
输入拦截器链有例如以下几个阶段,这些阶段依照在拦截器链中的先后顺序排列。
| 阶段名称 | 阶段功能描写叙述 |
|---|---|
| RECEIVE | Transport level processing(接收阶段,传输层处理) |
| (PRE/USER/POST)_STREAM | Stream level processing/transformations(流处理/转换阶段) |
| READ | This is where header reading typically occurs(SOAPHeader读取) |
| (PRE/USER/POST)_PROTOCOL | Protocol processing, such as JAX-WS SOAP handlers(协议处理阶段,比如JAX-WS的Handler处理) |
| UNMARSHAL | Unmarshalling of the request(SOAP请求解码阶段) |
| (PRE/USER/POST)_LOGICAL | Processing of the umarshalled request(SOAP请求解码处理阶段) |
| PRE_INVOKE | Pre invocation actions(调用业务处理之前进入该阶段) |
| INVOKE | Invocation of the service(调用业务阶段) |
| POST_INVOKE | Invocation of the outgoing chain if there is one(提交业务处理结果,并触发输入连接器) |
输出拦截器链有例如以下几个阶段,这些阶段依照在拦截器链中的先后顺序排列。
| 阶段名称 | 阶段功能描写叙述 |
|---|---|
| SETUP | Any set up for the following phases(设置阶段) |
| (PRE/USER/POST)_LOGICAL | Processing of objects about to marshalled |
| PREPARE_SEND | Opening of the connection(消息发送准备阶段。在该阶段创建Connection) |
| PRE_STREAM | 流准备阶段 |
| PRE_PROTOCOL | Misc protocol actions(协议准备阶段) |
| WRITE | Writing of the protocol message, such as the SOAP Envelope.(写消息阶段) |
| MARSHAL | Marshalling of the objects |
| (USER/POST)_PROTOCOL | Processing of the protocol message |
| (USER/POST)_STREAM | Processing of the byte level message(字节处理阶段,在该阶段把消息转为字节) |
| SEND | 消息发送 |
在输出拦截器链的SEND阶段后,还会触发以_ENDING结尾阶段,这些ENDING阶段与以上阶段相应,主要用于清理或者关闭资源。ENDING阶段触发的顺序例如以下:
- SEND_ENDING
- POST_STREAM_ENDING
- USER_STREAM_ENDING
- POST_PROTOCOL_ENDING
- USER_PROTOCOL_ENDING
- MARSHAL_ENDING
- WRITE_ENDING
- PRE_PROTOCOL_ENDING
- PRE_STREAM_ENDING
- PREPARE_SEND_ENDING
- POST_LOGICAL_ENDING
- USER_LOGICAL_ENDING
- PRE_LOGICAL_ENDING
- SETUP_ENDING
CXF默认拦截器链
在CXF中,全部对消息的处理都是通过各种拦截器实现。CXF已经实现了多种拦截器,如操纵消息头、运行认证检查、验证消息数据、日志记录、消息压缩等。有些拦截器在公布服务、訪问服务时已经默认加入到拦截器链。
CXF默认输入拦截器链,假设没有加入额外的拦截器。CXF输入会顺序经过下面拦截器:
| 拦截器名称 | 拦截器功能 |
|---|---|
| AttachmentInInterceptor | Parse the mime headers for mime boundaries, finds the “root” part and resets the input stream to it, and stores the other parts in a collection of Attachments |
| StaxInInterceptor | Creates an XMLStreamReader from the transport InputStream on the Message |
| ReadHeadersInterceptor | Parses the SOAP headers and stores them on the Message |
| SoapActionInInterceptor | Parses “soapaction” header and looks up the operation if a unique operation can be found for that action. |
| MustUnderstandInterceptor | Checks the MustUnderstand headers, its applicability and process it, if required |
| SOAPHandlerInterceptor | SOAP Handler as per JAX-WS |
| LogicalHandlerInInterceptor | Logical Handler as per JAX-WS |
| CheckFaultInterceptor | Checks for fault, if present aborts interceptor chain and invokes fault handler chain |
| URIMappingInterceptor | Can handle HTTP GET, extracts operation info and sets the same in the Message |
| DocLiteralnInterceptor | Examines the first element in the SOAP body to determine the appropriate Operation (if soapAction did not find one) and calls the Databinding to read in the data. |
| SoapHeaderInterceptor | Perform databinding of the SOAP headers for headers that are mapped to parameters |
| WrapperClassInInterceptor | For wrapped doc/lit, the DocLiteralInInterceptor probably read in a single JAXB bean. This interceptor pulls the individual parts out of that bean to construct the Object[] needed to invoke the service. |
| SwAInInterceptor | For Soap w/ Attachments, finds the appropriate attachments and assigns them to the correct spot in the parameter list. |
| HolderInInterceptor | For OUT and IN/OUT parameters, JAX-WS needs to create Holder objects. This interceptor creates the Holders and puts them in the parameter list. |
| ServiceInvokerInInterceptor | Actually invokes the service. |
CXF默认输出拦截器链,假设没有加入额外的拦截器,CXF输入会顺序经过下面拦截器:
| 拦截器名称 | 拦截器功能 |
|---|---|
| HolderOutInterceptor | For OUT and IN/OUT params, pulls the values out of the JAX-WS Holder objects (created in HolderInInterceptor) and adds them to the param list for the out message. |
| SwAOutInterceptor | For OUT parts that are Soap attachments, pulls them from the list and holds them for later. |
| WrapperClassOutInterceptor | For doc/lit wrapped, takes the remaining parts and creates a wrapper JAXB bean to represent the whole message. |
| SoapHeaderOutFilterInterceptor | Removes inbound marked headers |
| SoapActionOutInterceptor | Sets the SOAP Action |
| MessageSenderInterceptor | Calls back to the Destination object to have it setup the output streams, headers, etc… to prepare the outgoing transport. |
| SoapPreProtocolOutInterceptor | This interceptor is responsible for setting up the SOAP version and header, so that this is available to any pre-protocol interceptors that require these to be available. |
| AttachmentOutInterceptor | If this service uses attachments (either SwA or if MTOM is enabled), it sets up the Attachment marshallers and the mime stuff that is needed. |
| StaxOutInterceptor | Creates an XMLStreamWriter from the OutputStream on the Message. |
| SoapHandlerInterceptor | JAX-WS SOAPHandler |
| SoapOutInterceptor | Writes start element for soap:envelope and complete elements for other header blocks in the message. Adds start element for soap:body too. |
| LogicalHandlerOutInterceptor | JAX-WS Logical handler stuff |
| WrapperOutInterceptor | If wrapped doc/lit and not using a wrapper bean or if RPC lit, outputs the wrapper element to the stream. |
| BareOutInterceptor | Uses the databinding to write the params out. |
| SoapOutInterceptor$SoapOutEndingInterceptor | Closes the soap:body and soap:envelope |
| StaxOutInterceptor$StaxOutEndingInterceptor | Flushes the stax stream. |
| MessageSenderInt$MessageSenderEnding | Closes the exchange, lets the transport know everything is done and should be flushed to the client. |
CXF实战之拦截器Interceptor(四)的更多相关文章
- CXF之五 拦截器Interceptor
拦截器(Interceptor)是CXF功能最主要的扩展点,可以在不对核心模块进行修改的情况下,动态添加很多功能.拦截器和JAX-WS Handler.Filter的功能类似,当服务被调用时,就会创建 ...
- struts2拦截器interceptor的配置方法及使用
转: struts2拦截器interceptor的配置方法及使用 (2015-11-09 10:22:28) 转载▼ 标签: it 365 分类: Struts2 NormalText Code ...
- Flume-NG源码阅读之SourceRunner,及选择器selector和拦截器interceptor的执行
在AbstractConfigurationProvider类中loadSources方法会将所有的source进行封装成SourceRunner放到了Map<String, SourceRun ...
- 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之前,拦截 ...
随机推荐
- 在Visual Studio中使用类图描述领域模型
右键解决方案,添加一个名称为"Domain Model"的UML类图. 首先站在整体的角度添加类,先不要任何属性. 添加Customer对Wishlist的关联,把"属性 ...
- signapk.jar工具及系统platform密钥,platform.pk8 platform.x509.pem
from:http://download.csdn.net/download/ab6326795/6042755
- 斯巴达克斯血与沙第一季/全集Spartacus迅雷下载
斯巴达克斯血与沙 第一季Spartacus 1(2010) 本季看点:剧集讲述斯巴达克斯从奴隶变成英雄的血泪辛酸史.被罗马人背叛,流放成奴隶,变为角斗士--这一段罗马共和国历史上最富盛名的传奇故事无人 ...
- Android之多种Bitmap效果
1. 将图片变为圆角 2. 获取缩略图图片 3. LOMO特效 4. 旧时光特效 5. 暖意特效 6. 根据饱和度.色相.亮度调整图片 7. 添加图片外边框 8. 添加内边框 9. 创建一个缩放的图片 ...
- java常见反编译工具
1.Java反编译插件 —— Jadclipse JadClipse是Jad的Eclipse插件,是一款非常实用而且方便地Java反编译插件,我们只需将下载的插件包复制到eclipse的plugins ...
- 短址服务 api
1 is.gd 他这个api简单: http://is.gd/api.php?longurl= 后面加网址就可以返回短址 2 Google URL Shortener API api地址: http ...
- 利用ASP.NET运行数据库的安装脚本
在启明星的演示站点里,经常有用户修改演示密码,导致别的用户无法访问. 为此,在登陆页面,增加了一个“初始化数据库”功能,这样,即使用户修改了密码,别的访问者,只要重置数据库,就可以很容易再次进入. 首 ...
- Reloading Java Classes 301: Classloaders in Web Development — Tomcat, GlassFish, OSGi, Tapestry 5 and so on Translation
The Original link : http://zeroturnaround.com/rebellabs/rjc301/ Copyright reserved by Rebel Inc In t ...
- android中解决“Dex Loader] Unable to execute dex: Multiple dex files define LXXX”错误
原因 1. 出现这种问题的主要原因:那就是你的libs下面引用了两个相同功能的包,可能这两个包的版本不一样而已,去掉一个吧,选择一个合适的版本. 2.build path里面包重复引用.
- Qt信号槽的一些事 Qt::带返回值的信号发射方式
一般来说,我们发出信号使用emit这个关键字来操作,但是会发现,emit并不算一个调用,所以它没有返回值.那么如果我们发出这个信号想获取一个返回值怎么办呢? 两个办法:1.通过出参形式返回,引用或者指 ...