快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门威斯尼斯人娱乐平台_龟发之家论坛



CXF的拦截器是CXF功能最主要的扩展点。经由过程自定义的Interceptor,可以改变哀乞降相应的一些消息处置惩罚,此中最基础的道理照样一个动态代理。

Inter澳门威斯尼斯人娱乐平台ceptor是CXF架构中一个很有特色的模式。你可以在纰谬核心模块进行改动的环境下,动态添加很多功能。这对付CXF这个以处置惩罚消息为中间的办事框架来说是异常有用的,CXF经由过程在Interceptor中对消息进行特殊处置惩罚,实现了很多紧张功能模块,例如:日志记录,Soap消息处置惩罚,消息的压缩处置惩罚。

假如你想对CXF进行扩展,建议你先从interceptor开始。

为了更好的进修和应用CXF,最好先涉猎官方的用户手册:

http://cwiki.apache.org/CXF20DOC/index.html

一、基滥觞基本理

下面看看CFX Interceptor在全部哀求相应的处置惩罚历程中所处的位置。

二、CFX Interceptor的核心API

先看拦截器核心包org.apache.cxf.interceptor的阐明:Core interceptor interfaces which form the basis for message processing chains in CXF.

翻译:CXF消息处置惩罚链最基础的拦截器接口。

一下几个的API的先容和翻译来自互联网:

Interceptor

定义两个措施,一个处置惩罚消息 handleMessage, 一个是处置惩罚差错 handleFault。别看Interceptor这么简单,这里必要提醒留意的是,在推行详细的Interceptor的这两个措施中,切切别调用Interceptor内部的成员变量。这是因为Interceptor是面向消息来进行处置惩罚的,每个Interceptor都有可能运行在不合的线程中,假如调用了Interceptor中的内部成员变量,就有在Interceptor中造成临界资本的造访的环境,而这时的Interceptor也就不是线程安然的Interc eptor了。

在CXF中最常应用的Interceptor都放在cxf-rt-core中的org.apache.cxf.interceptor中,有兴趣的同伙可以钻研一下。

InterceptorChain

单个的Interceptor功能有限,CXF要实现一个SOAP消息处置惩罚,必要将许许多多的Interceptor组合在一路应用。是以设计了 InterceptorChain,在我看了InterceptorChain就澳门威斯尼斯人娱乐平台像是一个Interceptor的小队长。 小队长有调配安置Interceptor的权力(add,remove),也有节制消息处置惩罚的权力(doInterceptor,pause,resume,reset,abort),同时也有交付差错处置惩罚的权力( {get|set}FaultObserver)。更故意思的是为机动节制Interceptor的处置惩罚消息顺序(doInterceptStartingAt,doInterceptorStartingAfter),这也是InterceptorChain对照难理解的地方。

有兴趣的同伙可以跟踪一下,CXF的Client与Server之间通讯是走过哪些Interceptor,这些Interceptor是若何被调用的。

Fault

定义了CXF中的差错消息。

InterceptorProvider

这里定义了Interceptor的后备保障部队。我们可以在InterceptorProvider中设置In,Out,InFault,OutFault 后备小分队,添加我们所盼望添加的Interceptor。而InterceptorChain会根据这些后备小分队,组建自己的小分队实例,完成详细的作军功能义务。

AbstractAttributedInterceptorProvider

InterceptorProvider实现的抽象类,因为这个类来承袭了HashMap,我们可以像这个类中存储一些属性信息。

AbstractBasicInterceptorProvider

与AbstractAttributedInterceptorProvider不合,这个Interceptor只是简单实现了InterceptorProvider的功能,并不供给对其属性存储的扩展。

Message

因为Interceptor是针对Message来进行处置惩罚的,当你打开Message这个类文件时,你会发明在Message中定义了很多常量,同时你还可以从Message中获取到很多与Message操作相关的信息。可以获取设置的工具有InterceptorChain Exchange Destination,还有获取设置Content的泛型接口,是不是感到Message和Bus差不多,都成了大年夜杂货铺,统统与消息处置惩罚相关的信息都可以放在Message中。我想这也是咱CXF以Message处置惩罚为中间的设计思惟的详细体现吧。

而一旦应用了Feature,我们的设置设置设备摆设摆设文件就变成了

三、CXF拦截器应用

CXF的应用也比Axis轻易很多,可以零丁应用,也可以与Spring完美整合,这里就经由过程上一个HelloWorld的例子来阐明若何应用拦截器。

比如,要实现一个SOAP消息哀求日志的功能,以便能动态监控哀求消息的信息。

之必要在在上文例子的根基做一点点篡改:

办事端

package ws;

import org.apache.cxf.endpoint.Server;

import org.apache.cxf.interceptor.LoggingInInterceptor;

import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

/**

* 办事端法度榜样设置与启动法度榜样

*

* @author leizhimin 2009-6-11 14:41:23

*/

public class HelloWorldServer {

public static void main(String[] args) {

JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();

factory.setServiceClass(HelloWorldImpl.class);

factory.setAddress("http://localhost:8080/service/HelloWorld");

factory.getInInterceptors().add(new LoggingInInterceptor());

Server server = factory.create();

server.start();

}

}

图片看不清楚?请点击这里查看原图(大年夜澳门威斯尼斯人娱乐平台图)。

实际的日志内容如下:

信息: Inbound Message

----------------------------

ID: 1

Address: /service/HelloWorld

Encoding: UTF-8

Content-Type: text/xml; charset=UTF-8

Headers: {Content-Length=[179], Host=[localhost:8080], User-Agent=[Apache CXF 2.2.2], connection=[keep-alive], SOAPAction=[""], Pragma=[no-cache], Content-Type=[text/xml; charset=UTF-8], content-type=[text/xml; charset=UTF-8], Cache-Control=[no-cache], Accept=[*/*]}

Payload: World

--------------------------------------

阐发日志可以看出,办事端日志输出了消息id、地址、编码、以及消息内容。

2、客户端节制台窗口:

在客户端节制台打印的日志截图是如下

图片看不清楚?请点击这里查看原图(大年夜图)。

实际的日志内容如下:

信息: Inbound Message

---澳门威斯尼斯人娱乐平台-------------------------

ID: 1

Encoding: UTF-8

Content-Type: text/xml; charset=utf-8

Headers: {Content-Length=[206], Server=[Jetty(6.1.18)], content-type=[text/xml; charset=utf-8]}

Payload: Hello World!

--------------------------------------

阐发日志可以看出,客户端日志输出了消息id、地址、编码、以及消息内容,这里的消息是哀求后获得的相应消息。

五、定义自己的Interceptor

自定的Interceptor必然要实现CXF的Interceptor接口,这个接口中有两个措施:

void hand澳门威斯尼斯人娱乐平台leFault(T message)

当拦截消息处置惩罚掉败时刻所调用的措施。

void handleMessage(T message)

拦截了一个消息,并做处置惩罚的措施。

对付SOAP这种XML款式的消息,开拓者处置惩罚太过于麻烦,并且CXF供给大年夜量的已经实现好的拦截器可供应用,只要机动运用这些拦截器就可以满意大年夜部分开拓的要求。

参考文档:

http://cwiki.apache.org/CXF20DOC/index.html

互联网的API翻译。

出处:http://lavasoft.blog.51cto.com/62575/167288

您可能还会对下面的文章感兴趣: