`
tigerl
  • 浏览: 98684 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多
在接受soap消息的时候,可能需要对消息做预处理!可以使用拦截器实现这一目的!

cxf有2种拦截器,InInterceptor、OutInterceptor,顾名思义,InInterceptor可以处理soap请求消息,OutInterceptor可以处理soap响应消息。

所有的拦截器都继承自AbstractPhaseInterceptor<?>,此抽象拦截器实现了Interceptor接口!

可以通过注解和配置文件2种方式来启用自定义的拦截器。

先来看一个InInterceptor
package XXX.web.webservice.interceptor;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.log4j.Logger;

public class ArtifactInInterceptor extends AbstractPhaseInterceptor<Message> {
	private static final Logger log = Logger.getLogger(ArtifactInInterceptor.class);
	
	public ArtifactInInterceptor() {
		//这儿使用receive,接收的意思
		super(Phase.RECEIVE);
	}

	public void handleMessage(Message message){
		
        try {
            InputStream is = message.getContent(InputStream.class);
            //这里可以对流做处理,从流中读取数据,然后修改为自己想要的数据
            
            //处理完毕,写回到message中
            //在这里需要注意一点的是,如果修改后的soap消息格式不符合webservice框架格式,比如:框架封装后的格式为
            //<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" <soap:Body>
            //<这里是调用服务端方法的命名空间><这是参数名称> 
            //这里才是真正的消息
            //</这里是调用服务端方法的命名空间></这是参数名称>
            //</soap:Body>
            //</soap:Envelope>
            //如果是以上这种格式,在暴露的接口方法里才会真正接收到消息,而如果请求中在body里边,没有加方法命名空间和参数名称,直接就是消息体
            //那接口方法里是接收不到消息的,因为cxf是按照上面的这种格式去解析的,所以如果不符合上面的格式,就应该在这里做处理
            //……………………处理代码……………………
            
            if(is != null)
            	message.setContent(InputStream.class, is);
        } catch (Exception e) {
        	log.error("Error when split original inputStream. CausedBy : "+"\n"+e);
		}
	}
}

然后使用注解@InInterceptors(interceptors="XXX.ArtifactInInterceptor")加到实现类上。
InInterceptor相比OutInterceptor来说简单多了,我在使用OutInterceptor的时候,始终从流里边读不到数据,官网上没有例子,网上也搜了好多好多,最后在一个国外的论坛上搜到了,使用方式如下:
package XXX.web.webservice.interceptor;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.commons.io.IOUtils;
import org.apache.cxf.io.CachedOutputStream;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.log4j.Logger;

public class ArtifactOutInterceptor extends AbstractPhaseInterceptor<Message>{
	private static final Logger log = Logger.getLogger(ArtifactOutInterceptor.class);

	public ArtifactOutInterceptor() {
		//这儿使用pre_stream,意思为在流关闭之前
		super(Phase.PRE_STREAM);
	}

	public void handleMessage(Message message) {

		try {

			OutputStream os = message.getContent(OutputStream.class);

			CachedStream cs = new CachedStream();

			message.setContent(OutputStream.class, cs);

			message.getInterceptorChain().doIntercept(message);

			CachedOutputStream csnew = (CachedOutputStream) message.getContent(OutputStream.class);
			InputStream in = csnew.getInputStream();
			
			String xml = IOUtils.toString(in);
			
			//这里对xml做处理,处理完后同理,写回流中
			IOUtils.copy(new ByteArrayInputStream(xml.getBytes()), os);
			
			cs.close();
			os.flush();

			message.setContent(OutputStream.class, os);


		} catch (Exception e) {
			log.error("Error when split original inputStream. CausedBy : " + "\n" + e);
		}
	}

	private class CachedStream extends CachedOutputStream {

		public CachedStream() {

			super();

		}

		protected void doFlush() throws IOException {

			currentStream.flush();

		}

		protected void doClose() throws IOException {

		}

		protected void onWrite() throws IOException {

		}

	}

}


然后使用注解@OutInterceptors(interceptors="XXX.ArtifactOutInterceptor")加到实现类上。

cxf框架中,有默认的拦截器链,可以使用addAfter()和addBefore()方法来指定自己的拦截器放到什么位置。

分享到:
评论
1 楼 zl954108007 2017-11-20  
你好,在处理outinterceptor的时候,读取不到流信息,InputStream in = csnew.getInputStream();  in一直是空,请教下当时是怎么解决的,还记得吗?

相关推荐

    CXF拦截器(Interceptor)的使用

    标题:“CXF拦截器(Interceptor)的使用” 描述:“讲解了cxf实现拦截器的原因、核心API及使用方法” 在深入探讨CXF拦截器的使用之前,我们首先需要理解其在CXF框架中的核心作用与价值。Apache CXF是一个开源框架,...

    CXF3.0+Spring3.2 自定义拦截器

    1. **CXF拦截器基础**:CXF的拦截器是基于JAX-WS规范的Handler Chain模型,分为In-bound(请求进来时触发)和Out-bound(响应出去时触发)两类。拦截器可以通过在服务配置中指定,或者通过编程方式动态添加。 2. **...

    08.CXF拦截器的理论以及如何为CXF的客户端和服务器端添加拦截器

    CXF拦截器的生命周期与消息处理紧密相关,主要包含以下阶段: 1. **Pre-Dispatch(预调度)**:在服务端,当请求到达但尚未被处理时执行。 2. **Inbound(输入)**:在服务端,请求正在被处理。 3. **Outbound...

    Cxf拦截器实例

    其中,拦截器(Interceptor)是CXF框架中的一个重要概念,允许我们在消息传递的过程中插入自定义逻辑。在这个"CxfInterceptor_CS"压缩包中,我们很可能会找到客户端和服务器端的拦截器实现示例。 拦截器是CXF中一种...

    webservice的cxf框架拦截器demo

    拦截器在CXF中是一种强大的工具,它允许开发者在消息发送或接收的过程中插入自定义的行为。这在处理认证、日志记录、事务管理等场景中非常有用。在提供的"inter_ws_server"和"inter_client"两个文件中,分别展示了...

    CXF WebService带有拦截器

    在CXF中,拦截器是处理消息生命周期中的关键组件,它们可以在消息发送前、接收后、发送后以及接收前执行自定义逻辑。这使得我们可以在不修改原有业务代码的情况下,轻松地添加额外的功能,如日志记录、安全检查或...

    CXF使用EndpointImpl发布WebService加入拦截器

    拦截器在CXF中的工作原理基于JAX-WS规范,可以分为两种类型:`InInterceptors`(入站拦截器)和`OutInterceptors`(出站拦截器)。入站拦截器处理从客户端到服务器的消息,而出站拦截器则处理从服务器返回到客户端的...

    CXF发布WebService加入拦截器

    拦截器是CXF框架中的一个重要组件,它们提供了在消息发送和接收过程中插入自定义逻辑的能力。 一、什么是CXF拦截器? CXF拦截器是一种AOP(面向切面编程)的概念,它们是执行特定任务的独立单元,可以在消息传递的...

    spring集成cxf客户端和服务器端demo(含自定义拦截器)

    在本项目中,"spring集成cxf客户端和服务器端demo(含自定义拦截器)"是一个实战案例,展示了如何在Spring框架下与Apache CXF服务进行整合,实现客户端和服务端的交互,并利用拦截器来增强功能。以下是这个项目涉及的...

    ip黑白名单拦截器java示例

    在IT安全领域,IP黑白名单拦截器是一种常见的技术手段,用于增强网络安全,防止恶意或不受信任的IP地址访问系统资源。以下将详细讲解基于Java实现的IP黑白名单拦截器及其核心概念。 首先,我们来看标题提及的“ip...

    11.为CXF客户端添加自定义拦截器完成权限控制

    在CXF中,拦截器可以插入到消息处理管道中,对请求和响应进行处理。 要为CXF客户端添加自定义拦截器,我们需要遵循以下步骤: 1. **创建拦截器类**:首先,创建一个实现了`org.apache.cxf.interceptor....

    10.为CXF服务器端添加自定义拦截器进行权限检查

    拦截器是CXF框架中的一种重要机制,它们允许我们在消息被处理之前或之后插入自定义逻辑,例如认证、日志记录、事务管理等,其中权限检查是常见应用场景之一。 要创建自定义拦截器,我们需要遵循以下步骤: 1. **...

    webservice的cxf框架拦截器demo.rar

    拦截器是CXF框架中的一个重要组件,它们在消息传递的过程中插入到服务调用链中,可以在消息发送前或接收到消息后执行自定义逻辑。拦截器可以用来添加额外的头部信息、验证消息、实现事务控制、记录日志或者进行安全...

    CXF-拦截器-权限控制-登录校验

    CXF提供了丰富的功能,包括服务端和客户端的拦截器(Interceptor)机制,使得开发者能对服务调用进行自定义处理,如权限控制和登录校验。本文将深入探讨"CXF拦截器-权限控制-登录校验"这一主题。 首先,我们需要...

    13.为CXF与Spring整合发布WebService添加拦截器进行权限控制

    拦截器是CXF提供的一种机制,它允许我们在Web服务调用的生命周期中的不同阶段插入自定义逻辑,如消息的发送和接收。这为我们提供了在服务执行前、后或过程中进行额外操作的机会,比如验证用户身份、日志记录、性能...

    CXF3.1.16 +Spring4 +MyBatis + Maven自定义拦截器 WebService实例源码下载

    5. 自定义拦截器:在CXF中,拦截器用于在消息发送或接收时插入自定义逻辑,例如认证、日志记录等。这里提到的自定义拦截器可能用于实现特定的安全或业务需求。 【描述解析】 "实现了客户端和服务端,客户端添加...

    java代理实现webservice接口拦截器功能

    本文根据java代理实现CXF拦截器异常时只能进入fault拦截器而不能继续向下执行的问题。 利用java代理让RMI具有拦截器的功能。

    WebService之自定义拦截器(server+client)

    1. **创建拦截器类**:继承自CXF提供的相应拦截器基类,如`org.apache.cxf.interceptor.FaultInterceptor`或`org.apache.cxf.interceptor.ClientInterceptor`。 2. **覆盖关键方法**:如`handleMessage(Message)`或`...

    CXF和Spring整合,并且添加拦截器

    **标题:“CXF和Spring整合,并且添加拦截器”** 在Java世界中,Apache CXF是一个流行的开源服务框架,用于创建和消费Web服务。它支持多种Web服务规范,包括SOAP、RESTful API以及WS-*标准。另一方面,Spring框架是...

    CXF自定义拦截器实现安全机制实例工程

    CXF 自定义拦截器实现的 webservice安全机制实例工程, 带jar包 ,代码注释详细 内有说明文档, 由于资源过大 ,所以客户端jar包 删除掉了, 只需要把服务端的jar 拷贝到 客户端即可 , 小弟刚刚研究完 CXF 安全 。...

Global site tag (gtag.js) - Google Analytics