CXF对Interceptor拦截器的支持
来源:互联网 发布:淘宝滴答清单兑换码 编辑:程序博客网 时间:2024/06/05 17:43
在每个请求响应之前或响应之后,做一些事情。这里的Interceptor就和Filter、Struts的Interceptor很类似,提供它的主要作用就是为了很好的降低代码的耦合性,提供代码的内聚性。下面我们就看看CXF的Interceptor是怎么样工作的。
1、 我们就用上面的HelloWorldService,客户端的调用代码重新写一份,代码如下:
上面的CXF的拦截器是添加在客户端,同样在服务器端也是可以添加拦截器Interceptor的。运行后结果如下:
2013-5-28 23:40:08 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
信息: Creating Service {http://service.hoo.com/}IHelloWorldServiceService from class com.hoo.service.IHelloWorldService
2013-5-28 23:40:09 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Outbound Message
---------------------------
ID: 1
Address: http://localhost:9000/helloWorld
Encoding: UTF-8
Content-Type: text/xml
Headers: {SOAPAction=[""], Accept=[*/*]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:sayHello xmlns:ns1="http://service.hoo.com/"><name>e421083458</name></ns1:sayHello></soap:Body></soap:Envelope>
--------------------------------------
2013-5-28 23:40:09 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Inbound Message
----------------------------
ID: 1
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {content-type=[text/xml;charset=UTF-8], Content-Length=[234], Server=[Jetty(7.2.2.v20101205)]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:sayHelloResponse xmlns:ns1="http://service.hoo.com/"><return>e421083458say : Hello World</return></ns1:sayHelloResponse></soap:Body></soap:Envelope>
--------------------------------------
[result]e421083458say : Hello World
上面的部分信息是LoggingInterceptor输出的日志信息,分别在请求和响应的时候输出日志信息,还有输出请求的时候参数的信息以及响应的时候返回值的信息。
2、 刚才是客户端添加Interceptor,现在我们自己编写一个Interceptor,这个Interceptor需要继承AbstractPhaseInterceptor,实现handleMessage和一个带参数的构造函数。然后在服务器端添加这个Interceptor。
Interceptor代码如下:
下面看看发布服务和添加自定义拦截器的代码:
值得说的是,以前发布WebService是用Endpoint的push方法。这里用的是JaxWsServerFactoryBean和客户端调用的代码JaxWsProxyFactoryBean有点不同。
客户端调用代码:
1、 我们就用上面的HelloWorldService,客户端的调用代码重新写一份,代码如下:
package com.hoo.client;import org.apache.cxf.interceptor.LoggingInInterceptor;import org.apache.cxf.interceptor.LoggingOutInterceptor;import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;import com.hoo.service.IHelloWorldService;public class ServiceMessageInterceperClient { public static void main(String args[]){ //调用WebService JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.setServiceClass(IHelloWorldService.class); factory.setAddress("http://localhost:9000/helloWorld"); factory.getInInterceptors().add(new LoggingInInterceptor()); factory.getOutInterceptors().add(new LoggingOutInterceptor()); IHelloWorldService service = (IHelloWorldService) factory.create(); System.out.println("[result]"+service.sayHello("e421083458")); }}
上面的CXF的拦截器是添加在客户端,同样在服务器端也是可以添加拦截器Interceptor的。运行后结果如下:
2013-5-28 23:40:08 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
信息: Creating Service {http://service.hoo.com/}IHelloWorldServiceService from class com.hoo.service.IHelloWorldService
2013-5-28 23:40:09 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Outbound Message
---------------------------
ID: 1
Address: http://localhost:9000/helloWorld
Encoding: UTF-8
Content-Type: text/xml
Headers: {SOAPAction=[""], Accept=[*/*]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:sayHello xmlns:ns1="http://service.hoo.com/"><name>e421083458</name></ns1:sayHello></soap:Body></soap:Envelope>
--------------------------------------
2013-5-28 23:40:09 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Inbound Message
----------------------------
ID: 1
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {content-type=[text/xml;charset=UTF-8], Content-Length=[234], Server=[Jetty(7.2.2.v20101205)]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:sayHelloResponse xmlns:ns1="http://service.hoo.com/"><return>e421083458say : Hello World</return></ns1:sayHelloResponse></soap:Body></soap:Envelope>
--------------------------------------
[result]e421083458say : Hello World
上面的部分信息是LoggingInterceptor输出的日志信息,分别在请求和响应的时候输出日志信息,还有输出请求的时候参数的信息以及响应的时候返回值的信息。
2、 刚才是客户端添加Interceptor,现在我们自己编写一个Interceptor,这个Interceptor需要继承AbstractPhaseInterceptor,实现handleMessage和一个带参数的构造函数。然后在服务器端添加这个Interceptor。
Interceptor代码如下:
package com.hoo.interceptor;import org.apache.cxf.interceptor.Fault;import org.apache.cxf.message.Message;import org.apache.cxf.phase.AbstractPhaseInterceptor;/** * 自定义消息拦截器 * @author Administrator * @createDate 2013-5-28下午5:28:38 * @file MessageInterceptor.java * @package com.hoo.interceptor * @project cxf_demo02 */public class MessageInterceptor extends AbstractPhaseInterceptor<Message> { //至少要一个带参的构造函数 public MessageInterceptor(String phase) { super(phase); } public void handleMessage(Message message) throws Fault { System.out.println("############handleMessage##########"); System.out.println(message); if (message.getDestination() != null) { System.out.println(message.getId() + "#" + message.getDestination().getMessageObserver()); } if (message.getExchange() != null) { System.out.println(message.getExchange().getInMessage() + "#" + message.getExchange().getInFaultMessage()); System.out.println(message.getExchange().getOutMessage() + "#" + message.getExchange().getOutFaultMessage()); } }}
下面看看发布服务和添加自定义拦截器的代码:
package com.hoo.delpoy;import org.apache.cxf.jaxws.JaxWsServerFactoryBean;import org.apache.cxf.phase.Phase;import com.hoo.interceptor.MessageInterceptor;import com.hoo.service.HelloWorldService;public class DeployInterceptorService { public static void main(String args[])throws InterruptedException{ //发布WebService JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean(); //设置Service Class factory.setServiceClass(HelloWorldService.class); factory.setAddress("http://localhost:9000/helloWorld"); //设置ServiceBean对象 factory.setServiceBean(new HelloWorldService()); //添加请求和相应的拦截器,Phase.RECEIVE只对In有效,Phase.SEND只对Out有效 factory.getInInterceptors().add(new MessageInterceptor(Phase.RECEIVE)); factory.getOutInterceptors().add(new MessageInterceptor(Phase.SEND)); factory.create(); System.out.println("Server start......"); Thread.sleep(1000 * 60); System.exit(0); System.out.println("Server exit "); }}
值得说的是,以前发布WebService是用Endpoint的push方法。这里用的是JaxWsServerFactoryBean和客户端调用的代码JaxWsProxyFactoryBean有点不同。
客户端调用代码:
package com.hoo.client;import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;import com.hoo.service.IHelloWorldService;public class HelloWorldServiceClient { public static void main(String[] args) { //调用WebService JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.setServiceClass(IHelloWorldService.class); factory.setAddress("http://localhost:9000/helloWorld"); IHelloWorldService service = (IHelloWorldService) factory.create(); System.out.println("[result]" + service.sayHello("hoojo")); }}
- CXF对Interceptor拦截器的支持
- CXF对Interceptor拦截器的支持
- CXF对Interceptor拦截器的支持
- CXF对Interceptor拦截器的支持
- CXF对Interceptor拦截器的支持
- CXF对Interceptor拦截器的支持
- 三、CXF对Interceptor拦截器的支持
- 三、CXF对Interceptor拦截器的支持
- 二、CXF对Interceptor拦截器的支持
- 三、CXF对Interceptor拦截器的支持
- 三、CXF对Interceptor拦截器的支持
- CXF对Interceptor的支持
- CXF Interceptor拦截器
- CXFWerService 3 对Interceptor拦截器的支持
- CXF拦截器(Interceptor)的使用
- spring boot-实现WebService(CXF实现)的拦截器(Interceptor)
- WebService CXF 中的拦截器(Interceptor)
- CXF实战之拦截器Interceptor(四)
- SEO工作者必经的三个阶段
- 【Android 开发】:Android中普通按钮的使用方法
- 从程序员到项目经理(13):如何管理自己的时间(下)
- 【我当项目经理那些年】建设项目团队—主题晨会
- Precomputed Radiance Transfer心得
- CXF对Interceptor拦截器的支持
- 源代码管理之SVN服务器搭建和使用
- 人脸识别考勤应用实践
- 深入理解Magento-第十章-数据操作&数据收集器
- 用GIT弥补早期版本管理工具的不足
- codeforces_312A Whose sentence is it?
- Magento学习资源
- android 静音与振动
- 如何避免“iterator not incrementable”错误