拦截器是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的拦截器的更多相关文章

  1. 【WebService】WebService之CXF的拦截器(五)

    CXF拦截器介绍 CXF拦截器是功能的主要实现单元,也是主要的扩展点,可以在不对核心模块进行修改的情况下,动态添加功能.当服务被调用时,会经过多个拦截器链(Interceptor Chain)处理,拦 ...

  2. CXF之五 拦截器Interceptor

    拦截器(Interceptor)是CXF功能最主要的扩展点,可以在不对核心模块进行修改的情况下,动态添加很多功能.拦截器和JAX-WS Handler.Filter的功能类似,当服务被调用时,就会创建 ...

  3. 【CXF】- 拦截器 Interceptor

    CXF拦截器 拦截动态操作请求和响应数据 拦截器分类 位置:服务器端拦截器,客户端拦截器 消息方向:入拦截器 出拦截器 定义者:系统拦截器 自定义拦截器:LoggingInInteceptor ①:创 ...

  4. CXF添加拦截器和自定义拦截器

    前面讲了如何采用CXF开发webservice,现在来讲如何添加拦截器和自定义拦截器. 服务端代码: HelloWorld implementor=new HelloWorldImpl(); Stri ...

  5. Apache CXF自定义拦截器

    为什么设计拦截器?1.为了在webservice请求过程中,能动态操作请求和响应数据,CXF设计了拦截器 拦截器分类: 1.按所处的位置分:服务器端拦截器,客户端拦截器. 2.按消息的方向分:入拦截器 ...

  6. CXF 自定义拦截器

    此例子来自apache cxf sample. /**  * Licensed to the Apache Software Foundation (ASF) under one  * or more ...

  7. (八)CXF添加自定义拦截器

    前面我们说到CXF添加内置的拦截器,今天的话,我们来讲下如何添加自定义拦截器: 我们的实例是客户端访问服务端webservice接口要加权限认证. 我们思路先说下.我们可以通过在SOAP消息的Head ...

  8. (七)CXF添加拦截器

    今天开始讲下拦截器,前面大家学过servlet,struts2 都有拦截器概念,主要作用是做一些权限过滤,编码处理等: webservice也可以加上拦截器,我们可以给webservice请求加权限判 ...

  9. Spring+SpringMVC+MyBatis深入学习及搭建(十七)——SpringMVC拦截器

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7098753.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十六)--S ...

随机推荐

  1. anyRTC 6月SDK更新迭代

    anyRTC 6月更新迭代,macOS新增屏幕 ID 进行屏幕共享功能,让共享更高效简单:此外解决了视频的宽高不是16:9导致共享内容缺失的问题,同时对音视频模块,推流组件等多项功能进行了优化改进. ...

  2. 解决 Flask 项目无法用 .env 文件中解析的参数设置环境变量的错误

    在 Windows 上启动 Flask 项目时,工作目录有 UTF-8 编码的 .env 文件,里面配置的环境变量在 Python2 中识别为 Unicode 类型,导致下述错误: * Serving ...

  3. python,ctf笔记随笔

    一.在centos虚拟机中安装pyhton3环境: 安装pip3:yum install python36-pip 将pip升级到最新版本:pip3 install --upgrade pip 运行p ...

  4. Android:Android Studio导入OpenCV(Android项目)

    在使用OpenCV之前,Android必须先下载ndk,因为OpenCV使用了native代码,这里建议Android Studio创建C++项目来写OpenCV的内容 1.首先在官网下载OpenCV ...

  5. dubbo学习实践(3)之Dubbo整合Consul及Dubbo配置方式

    前言:上一篇中,已经写到了使用zookeeper为注册中心的配置,下面写下配置Consul为注册中心 1. Consul注册中心验证 修改provider和consumer的服务配置文件 Provid ...

  6. ElementUi 表单验证失败后 页面滚动到表单验证失败位置

    1.应用场景 当进行长表单验证时 用户填写到了单子的最下面 可是已经滚动过去的部分单子验证失败 为了友好的用户体验 这时候就需要滚动到验证失败位置 2.解决思路 elementUi本身并没有提供相关获 ...

  7. Manage Historical Snapshots in Sonarqube

    Login as admin, go to a dashboard of a project, then click "Configuration -> History" a ...

  8. 【笔记】scikit-learn中的Scaler(归一化)

    scikit-learn中的数据归一化 在机器学习使用数据归一化的时候有一个重要的注意事项 我们对训练数据进行均值和方差的处理,得到mean_train以及std_train,但是在对测试数据进行归一 ...

  9. 活久见!TCP两次挥手,你见过吗?那四次握手呢?

    活久见!TCP两次挥手,你见过吗?那四次握手呢? 文章持续更新,可以微信搜一搜「小白debug」第一时间阅读,回复[教程]获golang免费视频教程.本文已经收录在GitHub https://git ...

  10. AI中各种浮点精度概念集合:fp16,fp32,bf16,tf32,fp24,pxr24,ef32

    常见的浮点类型有fp16,fp32,bf16,tf32,fp24,pxr24,ef32,能表达的数据范围主要看exponent,精度主要看fraction. 可以看出表达的数据范围看fp32,bf16 ...