WebService学习总结(五)--CXF的拦截器
拦截器是Cxf的基础,Cxf中很多的功能都是由内置的拦截器来实现的,拦截器在Cxf中由Interceptor表示。拦截器的作用类似axis2中handle。Cxf的拦截器包括入拦截器和出拦截器,所有的入拦截器或出拦截器构成了一个拦截器链,它们可以作用在Server端也可以作用在Client端。当需要使用拦截器链处理消息的时候,Cxf会确保对应的消息被拦截器链里面的每一个拦截器都执行一遍。拦截器链在Cxf中由InterceptorChain接口表示,org.apache.cxf.phase.PhaseInterceptorChain类的public synchronized boolean doIntercept(Message message)方法,它是拦截器链拦截Message的实现。当客户端发送一个请求到服务端时会经过客户端的出拦截器和服务端的入拦截器;当服务端对客户端的请求进行响应时对应的响应消息会经过服务端的出拦截器和客户端的入拦截器。
下面简单介绍一下服务端拦截器,在上一篇工程基础上进行如下修改:
在服务端应用里面,增加一个类,这个类继承自AbstractPhaseInterceptor。
package com.myl.interceptor; import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
/**
*
* @author myl
* @date 2018年4月18日 上午12:10:20
*
* 拦截器,继承AbstractPhaseInterceptor<Message>
*/
public class WsInterceptor extends AbstractPhaseInterceptor<Message> { public WsInterceptor(String phase) {
super(phase);
// TODO Auto-generated constructor stub
} @Override
public void handleMessage(Message message) throws Fault {
// TODO Auto-generated method stub
System.out.println("-------into Interceptor-------");
System.out.println(message);
if(message.getDestination() != null){
System.out.println(message.getId() + "-" + message.getDestination().getMessageObserver());
}
if(message.getExchange() != null){
System.out.println(message.getId() + "#" + message.getExchange().getInFaultMessage());
System.out.println(message.getId() + "#" + message.getExchange().getOutFaultMessage());
}
System.out.println("-------out Interceptor-------");
} }
修改服务发布,注意下面加粗斜体的地方
package com.myl.test.publish; import org.apache.cxf.endpoint.Server;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import org.apache.cxf.phase.Phase; import com.myl.interceptor.WsInterceptor;
import com.myl.service.serviceImpl.StudentWsImpl; /**
*
* @author myl
* @date 2018年4月15日 下午11:26:50
* 服务端发布接口
*/
public class StudentTest { public static void main(String[] args) {
System.out.println("web service start");
//获取工厂对象
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean(); //这里必须传入class,不能是接口,否则客户端会报异常 Could not instantiate service class ... because it is an interface
factory.setServiceClass(StudentWsImpl.class);
//传入接口url
factory.setAddress("http://localhost:5555/studentws");
//往入拦截器链中添加拦截器
factory.getInInterceptors().add(new WsInterceptor(Phase.RECEIVE));
//往出拦截器链中添加拦截器
factory.getOutInterceptors().add(new WsInterceptor(Phase.SEND));
//创建接口
Server server = factory.create();
//启动接口
server.start();
System.out.println("web service started");
} }
启动服务后,当客户端调用服务端接口的时候,我们可以看到拦截器发挥作用,日志如下:
-------into Interceptor-------
{http.base.path=http://localhost:5555, HTTP.REQUEST=Request(POST /studentws?wsdl)@4b47c90, org.apache.cxf.transport.Destination=org.apache.cxf.transport.http_jetty.JettyHTTPDestination@4561dae, HTTP.CONFIG=null, org.apache.cxf.binding.soap.SoapVersion=org.apache.cxf.binding.soap.Soap11@6da4eb38, org.apache.cxf.message.Message.QUERY_STRING=wsdl, org.apache.cxf.message.Message.ENCODING=UTF-8, HTTP.CONTEXT=ServletContext@o.e.j.s.h.ContextHandler@5082d622{/,null,AVAILABLE}, Content-Type=text/xml; charset=UTF-8, org.apache.cxf.security.SecurityContext=org.apache.cxf.transport.http.AbstractHTTPDestination$2@12c06064, org.apache.cxf.continuations.ContinuationProvider=org.apache.cxf.transport.http.Servlet3ContinuationProvider@188a71a, org.apache.cxf.message.Message.PROTOCOL_HEADERS={Accept=[*/*], Cache-Control=[no-cache], connection=[keep-alive], Content-Length=[250], content-type=[text/xml; charset=UTF-8], Host=[localhost:5555], Pragma=[no-cache], SOAPAction=[""], User-Agent=[Apache-CXF/3.1.15]}, org.apache.cxf.request.url=http://localhost:5555/studentws, Accept=*/*, org.apache.cxf.request.uri=/studentws, org.apache.cxf.message.Message.PATH_INFO=/studentws, org.apache.cxf.transport.https.CertConstraints=null, HTTP.RESPONSE=HTTP/1.1 200
Date: Tue, 17 Apr 2018 16:24:13 GMT , org.apache.cxf.request.method=POST, org.apache.cxf.async.post.response.dispatch=true, org.apache.cxf.message.Message.IN_INTERCEPTORS=[org.apache.cxf.transport.https.CertConstraintsInterceptor@fd5a77f], HTTP_CONTEXT_MATCH_STRATEGY=stem, http.service.redirection=null, org.apache.cxf.message.Message.BASE_PATH=/studentws, org.apache.cxf.configuration.security.AuthorizationPolicy=null, org.apache.cxf.message.Message.FIXED_PARAMETER_ORDER=false}
null-org.apache.cxf.transport.ChainInitiationObserver@45e27096
null#null
null#null
-------out Interceptor-------
addStudent-------------
student是否为空--com.myl.entity.Student@490b0e79
ya -------into Interceptor-------
{org.apache.cxf.message.Message.PROTOCOL_HEADERS={}, http.headers.copied=true, org.apache.cxf.service.model.MessageInfo=[MessageInfo OUTPUT: {http://serviceImpl.service.myl.com/}addStudentServiceResponse], org.apache.cxf.binding.soap.SoapVersion=org.apache.cxf.binding.soap.Soap11@6da4eb38, javax.xml.ws.wsdl.operation={http://serviceImpl.service.myl.com/}addStudentService, javax.xml.ws.wsdl.service={http://serviceImpl.service.myl.com/}StudentWsImplService, HTTP.RESPONSE=HTTP/1.1 200
Date: Tue, 17 Apr 2018 16:24:13 GMT
Content-Type: text/xml; charset=UTF-8 , org.apache.cxf.headers.Header.list=[], schema-validation-enabled=NONE, wrote.envelope.start=true, org.apache.cxf.service.model.BindingMessageInfo=org.apache.cxf.service.model.BindingMessageInfo@1603131c, javax.xml.ws.wsdl.port={http://serviceImpl.service.myl.com/}StudentWsImplPort, javax.xml.ws.wsdl.interface={http://serviceImpl.service.myl.com/}StudentWsImpl, javax.xml.ws.wsdl.description=http://localhost:5555/studentws?wsdl, org.apache.cxf.mime.headers={}, org.apache.cxf.message.Message.ENCODING=UTF-8, org.apache.cxf.ws.policy.EffectivePolicy=org.apache.cxf.ws.policy.EffectivePolicyImpl@2d1abacf, org.apache.cxf.message.Message.RESPONSE_CODE=200, Content-Type=text/xml}
null#null
null#null
-------out Interceptor-------
省略部分....
客户端可以跟服务端类似写,我测试直接用的一样的
package com.interceptor; import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
/**
*
* @author myl
* @date 2018年4月18日 上午12:10:20
*
* 客户端 拦截器,继承AbstractPhaseInterceptor<Message>
*/
public class WsInterceptor extends AbstractPhaseInterceptor<Message> { public WsInterceptor(String phase) {
super(phase);
// TODO Auto-generated constructor stub
} @Override
public void handleMessage(Message message) throws Fault {
// TODO Auto-generated method stub
System.out.println("-------into Interceptor Client-------");
System.out.println(message);
if(message.getDestination() != null){
System.out.println(message.getId() + "-" + message.getDestination().getMessageObserver());
}
if(message.getExchange() != null){
System.out.println(message.getId() + "#" + message.getExchange().getInFaultMessage());
System.out.println(message.getId() + "#" + message.getExchange().getOutFaultMessage());
}
System.out.println("-------out Interceptor Client-------");
} }
客户端调用接口
package com.client; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.phase.Phase; import com.interceptor.WsInterceptor;
import com.webservice.StudentWsImpl; /**
* @author myl
* @date 2018年4月15日
* 客户端调用服务端发布的接口
*/
public class StudentSerivceTest { public static void main(String[] args) {
//获取工厂对象
JaxWsProxyFactoryBean jwpfb = new JaxWsProxyFactoryBean();
//加载生成的StudentWsImpl类
jwpfb.setServiceClass(StudentWsImpl.class);
//传入url接口地址
jwpfb.setAddress("http://localhost:5555/studentws?wsdl");
//往入拦截器链中添加拦截器
jwpfb.getInInterceptors().add(new WsInterceptor(Phase.RECEIVE));
//往出拦截器链中添加拦截器
jwpfb.getOutInterceptors().add(new WsInterceptor(Phase.SEND)); //创建接口对象
StudentWsImpl ws = (StudentWsImpl) jwpfb.create();
//调用接口中的方法
ws.addStudentService("mao", "11", "22");
ws.addStudentService("ya", "15", "23");
ws.queryStudentService("mao");
ws.queryStudentService("ya"); } }
客户端日志
-------into Interceptor Client-------
{org.apache.cxf.message.Message.PROTOCOL_HEADERS={Accept=[*/*], SOAPAction=[""]}, org.apache.cxf.transport.Conduit=conduit: class org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduit57241990target: http://localhost:5555/studentws?wsdl, use.async.http.conduit=false, org.apache.cxf.service.model.MessageInfo=[MessageInfo INPUT: {http://serviceImpl.service.myl.com/}addStudentService], org.apache.cxf.binding.soap.SoapVersion=org.apache.cxf.binding.soap.Soap11@1583741e, org.apache.cxf.message.Message.ENDPOINT_ADDRESS=http://localhost:5555/studentws?wsdl, org.apache.cxf.headers.Header.list=[], schema-validation-enabled=NONE, org.apache.cxf.request.method=POST, http.connection.address=org.apache.cxf.transport.http.Address@5b367418, wrote.envelope.start=true, http.connection=sun.net.www.protocol.http.HttpURLConnection:http://localhost:5555/studentws?wsdl, org.apache.cxf.service.model.BindingMessageInfo=org.apache.cxf.service.model.BindingMessageInfo@36060e, org.apache.cxf.invocation.context={ResponseContext={}, RequestContext={org.apache.cxf.jaxws.context.WrappedMessageContext.SCOPES={org.apache.cxf.message.Message.ENDPOINT_ADDRESS=APPLICATION}, org.apache.cxf.message.Message.ENDPOINT_ADDRESS=http://localhost:5555/studentws?wsdl, java.lang.reflect.Method=public abstract boolean com.webservice.StudentWsImpl.addStudentService(java.lang.String,java.lang.String,java.lang.String)}}, org.apache.cxf.client=true, client.holders=[null, null, null], org.apache.cxf.jaxws.context.WrappedMessageContext.SCOPES={org.apache.cxf.message.Message.ENDPOINT_ADDRESS=APPLICATION}, org.apache.cxf.mime.headers={}, org.apache.cxf.message.inbound=false, org.apache.cxf.message.Message.ENCODING=UTF-8, org.apache.cxf.ws.policy.EffectivePolicy=org.apache.cxf.ws.policy.EffectivePolicyImpl@481ba2cf, java.lang.reflect.Method=public abstract boolean com.webservice.StudentWsImpl.addStudentService(java.lang.String,java.lang.String,java.lang.String), http.scheme=http, Content-Type=text/xml}
null#null
null#null
-------out Interceptor Client-------
-------into Interceptor Client-------
{org.apache.cxf.message.Message.PROTOCOL_HEADERS={Content-Length=[241], content-type=[text/xml; charset=UTF-8], Date=[Tue, 17 Apr 2018 16:39:14 GMT], Server=[Jetty(9.2.22.v20170606)]}, org.apache.cxf.ws.policy.AssertionInfoMap={}, org.apache.cxf.transport.Conduit=conduit: class org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduit57241990target: http://localhost:5555/studentws?wsdl, org.apache.cxf.client=true, org.apache.cxf.binding.soap.SoapVersion=org.apache.cxf.binding.soap.Soap11@1583741e, org.apache.cxf.message.Message.ENCODING=UTF-8, org.apache.cxf.message.inbound=true, org.apache.cxf.message.Message.RESPONSE_CODE=200, Content-Type=text/xml; charset=UTF-8}
null#null
null#null
-------out Interceptor Client-------
-------into Interceptor Client-------
{org.apache.cxf.message.Message.PROTOCOL_HEADERS={Accept=[*/*], SOAPAction=[""]}, org.apache.cxf.transport.Conduit=conduit: class org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduit57241990target: http://localhost:5555/studentws?wsdl, use.async.http.conduit=false, org.apache.cxf.service.model.MessageInfo=[MessageInfo INPUT: {http://serviceImpl.service.myl.com/}addStudentService], org.apache.cxf.binding.soap.SoapVersion=org.apache.cxf.binding.soap.Soap11@1583741e, org.apache.cxf.message.Message.ENDPOINT_ADDRESS=http://localhost:5555/studentws?wsdl, org.apache.cxf.headers.Header.list=[], schema-validation-enabled=NONE, org.apache.cxf.request.method=POST, http.connection.address=org.apache.cxf.transport.http.Address@5b367418, wrote.envelope.start=true, http.connection=sun.net.www.protocol.http.HttpURLConnection:http://localhost:5555/studentws?wsdl, org.apache.cxf.service.model.BindingMessageInfo=org.apache.cxf.service.model.BindingMessageInfo@36060e, org.apache.cxf.invocation.context={ResponseContext={}, RequestContext={org.apache.cxf.jaxws.context.WrappedMessageContext.SCOPES={org.apache.cxf.message.Message.ENDPOINT_ADDRESS=APPLICATION}, org.apache.cxf.message.Message.ENDPOINT_ADDRESS=http://localhost:5555/studentws?wsdl, java.lang.reflect.Method=public abstract boolean com.webservice.StudentWsImpl.addStudentService(java.lang.String,java.lang.String,java.lang.String)}}, org.apache.cxf.client=true, client.holders=[null, null, null], org.apache.cxf.jaxws.context.WrappedMessageContext.SCOPES={org.apache.cxf.message.Message.ENDPOINT_ADDRESS=APPLICATION}, org.apache.cxf.mime.headers={}, org.apache.cxf.message.inbound=false, org.apache.cxf.message.Message.ENCODING=UTF-8, org.apache.cxf.ws.policy.EffectivePolicy=org.apache.cxf.ws.policy.EffectivePolicyImpl@481ba2cf, java.lang.reflect.Method=public abstract boolean com.webservice.StudentWsImpl.addStudentService(java.lang.String,java.lang.String,java.lang.String), http.scheme=http, Content-Type=text/xml}
null#null
null#null
-------out Interceptor Client-------
-------into Interceptor Client-------
{org.apache.cxf.message.Message.PROTOCOL_HEADERS={Content-Length=[241], content-type=[text/xml; charset=UTF-8], Date=[Tue, 17 Apr 2018 16:39:14 GMT], Server=[Jetty(9.2.22.v20170606)]}, org.apache.cxf.ws.policy.AssertionInfoMap={}, org.apache.cxf.transport.Conduit=conduit: class org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduit57241990target: http://localhost:5555/studentws?wsdl, org.apache.cxf.client=true, org.apache.cxf.binding.soap.SoapVersion=org.apache.cxf.binding.soap.Soap11@1583741e, org.apache.cxf.message.Message.ENCODING=UTF-8, org.apache.cxf.message.inbound=true, org.apache.cxf.message.Message.RESPONSE_CODE=200, Content-Type=text/xml; charset=UTF-8}
null#null
null#null
-------out Interceptor Client-------
简单测试,如有错误请多指点
WebService学习总结(五)--CXF的拦截器的更多相关文章
- 【WebService】WebService之CXF的拦截器(五)
CXF拦截器介绍 CXF拦截器是功能的主要实现单元,也是主要的扩展点,可以在不对核心模块进行修改的情况下,动态添加功能.当服务被调用时,会经过多个拦截器链(Interceptor Chain)处理,拦 ...
- CXF之五 拦截器Interceptor
拦截器(Interceptor)是CXF功能最主要的扩展点,可以在不对核心模块进行修改的情况下,动态添加很多功能.拦截器和JAX-WS Handler.Filter的功能类似,当服务被调用时,就会创建 ...
- 【CXF】- 拦截器 Interceptor
CXF拦截器 拦截动态操作请求和响应数据 拦截器分类 位置:服务器端拦截器,客户端拦截器 消息方向:入拦截器 出拦截器 定义者:系统拦截器 自定义拦截器:LoggingInInteceptor ①:创 ...
- CXF添加拦截器和自定义拦截器
前面讲了如何采用CXF开发webservice,现在来讲如何添加拦截器和自定义拦截器. 服务端代码: HelloWorld implementor=new HelloWorldImpl(); Stri ...
- Apache CXF自定义拦截器
为什么设计拦截器?1.为了在webservice请求过程中,能动态操作请求和响应数据,CXF设计了拦截器 拦截器分类: 1.按所处的位置分:服务器端拦截器,客户端拦截器. 2.按消息的方向分:入拦截器 ...
- CXF 自定义拦截器
此例子来自apache cxf sample. /** * Licensed to the Apache Software Foundation (ASF) under one * or more ...
- (八)CXF添加自定义拦截器
前面我们说到CXF添加内置的拦截器,今天的话,我们来讲下如何添加自定义拦截器: 我们的实例是客户端访问服务端webservice接口要加权限认证. 我们思路先说下.我们可以通过在SOAP消息的Head ...
- (七)CXF添加拦截器
今天开始讲下拦截器,前面大家学过servlet,struts2 都有拦截器概念,主要作用是做一些权限过滤,编码处理等: webservice也可以加上拦截器,我们可以给webservice请求加权限判 ...
- Spring+SpringMVC+MyBatis深入学习及搭建(十七)——SpringMVC拦截器
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7098753.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十六)--S ...
随机推荐
- 第一章 Vant的引入和基本使用
Vant UI组件库基本使用 一.Vant官网 https://youzan.github.io/vant/#/zh-CN/ 二.安装Vant npm install --save vant 三.安装 ...
- ecshop 连接sae数据库的配置
// database host$db_host = "w.rdc.sae.sina.com.cn:3307";// database name$db_name = &qu ...
- H5页面怎么跳转到公众号主页?看过来
前言: 做公众号开发的小伙伴,可能会遇到这种需求: 在一个H5页面点击一个关注公众号按钮跳转到公众号主页. 听到这个需求的一瞬间,疑惑了!这不可能! 摸了摸高亮的额头!没办法,做还是要做的 开始上解决 ...
- springboot未授权
http://ip/actuator/heapdump http://ip/env http://ip/autoconfig http://ip/info http://ip/trace
- C++手写内存池
引言 使用new expression为类的多个实例分配动态内存时,cookie导致内存利用率可能不高,此时我们通过实现类的内存池来降低overhead.从不成熟到巧妙优化的内存池,得益于union的 ...
- Android 键盘属性
键盘定义:通过Keyboard说明是一个软键盘定义文件,Row元素说明这是一行按键的定义,Key元素说明这是一个按键的定义.Key元素通过一些属性来定义每个按键,下面是一些常用的属性介绍: Codes ...
- 被字节跳动、小米、美团面试官问的AndroidFramework难倒了? 这里有23道面试真题,助力成为offer收割机!
目录 1.Android中多进程通信的方式有哪些?a.进程通信你用过哪些?原理是什么?(字节跳动.小米)2.描述下Binder机制原理?(东方头条)3.Binder线程池的工作过程是什么样?(东方头条 ...
- HTML5(十一)——WebSocket 基础教程
一.为什么要学 WebSocket? websocket 是 HTML5 提供的一种长链接双向通讯协议,使得客户端和服务器之间的数据交换更简单,允许服务端主动向客户端推送数据,并且客户端与服务端只需连 ...
- ElementUi 表单验证失败后 页面滚动到表单验证失败位置
1.应用场景 当进行长表单验证时 用户填写到了单子的最下面 可是已经滚动过去的部分单子验证失败 为了友好的用户体验 这时候就需要滚动到验证失败位置 2.解决思路 elementUi本身并没有提供相关获 ...
- Notes of Cygwin in Windows7
Installation download setup.exe from its official website; run setup.exe, select "download with ...