`
yufenfei
  • 浏览: 802956 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

CXF之六(对请求参数和返回给客户数据处理)

阅读更多

  一、对客户端上送的参数统一处理  

      最近有人提出来这样的需求,通过WebService调用的接口时,请求的输出的某些参数值先进行加密(如密码等),然后再上送给服务器。所以造成了在接口中必须先对密文进行解密,然后再操作。我就想着通过CXF的拦截器进行统一处理,因为拦截器的功能非常强大。如果不熟悉CXF拦截器功能的童鞋可以先去熟悉一下。通过测试发现这种方法是可行的。具体代码如下:

第一步:创建拦截器

 

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;


/**
 * 对客户端上送的数据进行处理,可以完成以下功能
 * (1)、对加密的字段统一加密;
 * (2)、对特殊的字段进行特殊处理
 * 
 * @author  XX
 * @version  [版本号, 2012-11-07 下午02:34:07 ]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
@Service("gatewayInInterceptor")
public class GatewayInInterceptor extends AbstractPhaseInterceptor<Message> {
	private Logger logger = Logger.getLogger(GatewayInInterceptor.class);
	public GatewayInInterceptor(String phase) {
		super(phase);
	}
	
	public GatewayInInterceptor() {
		super(Phase.RECEIVE);
	}

	/** <功能详细描述>
	 * 创 建 人:  XX
	 * 创建时间:  2012-11-07 下午02:34:07  
	 * @param arg0
	 * @throws Fault
	 * @see [类、类#方法、类#成员]
	 */
	@SuppressWarnings("static-access")
	public void handleMessage(Message message) throws Fault {

		/* Iterator<Entry<String, Object>> it = message.entrySet().iterator();
		while (it.hasNext()) {
			Entry<String, Object> e = it.next();
			System.out.println(e.getKey() + "," + e.getValue());
		}*/
		String reqParams=null;
		 if(message.get(message.HTTP_REQUEST_METHOD).equals("GET")){//采用GET方式请求
			 reqParams=(String) message.get(message.QUERY_STRING);
			 message.remove(message.QUERY_STRING);
			 reqParams=this.getParams(this.getParamsMap(reqParams));
			 message.put(message.QUERY_STRING,reqParams);
			 
		 }else if(message.get(message.HTTP_REQUEST_METHOD).equals("POST")){//采用POST方式请求
			 try {
				 InputStream is = message.getContent(InputStream.class);
				 reqParams=this.getParams(this.getParamsMap(is.toString()));
					if (is != null)
						message.setContent(InputStream.class, new ByteArrayInputStream(reqParams.getBytes()));
				} catch (Exception e) {
					logger.error("GatewayInInterceptor异常",e);
				}
		 }
		 logger.info("请求的参数:"+reqParams);
	}
	
	private Map<String,String> getParamsMap(String strParams){
		if(strParams==null||strParams.trim().length()<=0){
			return null;
		}
		Map<String,String> map =new HashMap<String,String>();
		String[] params=strParams.split("&");
		for(int i=0;i<params.length;i++){
			String[] arr=params[i].split("=");
			map.put(arr[0], arr[1]);
		}
		return map;
	}
	
	private String getParams(Map<String,String> map){
		if(map==null||map.size()==0){
			return null;
		}
		StringBuffer sb=new StringBuffer();
		Iterator<String> it =map.keySet().iterator();
		while(it.hasNext()){
			String key=it.next();
			String value =map.get(key);
			/*这里可以对客户端上送过来的输入参数进行特殊处理。如密文解密;对数据进行验证等等。。。
			if(key.equals("content")){
				value.replace("%3D", "=");
				value = DesEncrypt.convertPwd(value, "DES");
			}*/
			if(sb.length()<=0){
				sb.append(key+"="+value);
			}else{
				sb.append("&"+key+"="+value);
			}
		}
		return sb.toString();
	}

}

 

第二步:修改配置文件

 

<jaxrs:server id="smsGateway" address="/smsGateway">
		<jaxrs:inInterceptors>
		   <ref bean="inMessageInterceptor"/>
		   <ref bean="gatewayInInterceptor"/>
		</jaxrs:inInterceptors>
		<jaxrs:outInterceptors>
		    <ref bean="outMessageInterceptor"/>
		 </jaxrs:outInterceptors>
		<jaxrs:serviceBeans>
			<ref bean="smsGatewayImpl" />
		</jaxrs:serviceBeans>
		<jaxrs:extensionMappings>
			<entry key="json" value="application/json" />
			<entry key="xml" value="application/xml" />
		</jaxrs:extensionMappings>
		<jaxrs:languageMappings>
			<entry key="en" value="en-gb" />
		</jaxrs:languageMappings>
		<jaxrs:providers>
	           <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
	           <bean class="com.pml.service.outer.InvokeFaultExceptionMapper"/>
	       </jaxrs:providers>
	</jaxrs:server>

 

 第三步:测试一下

 

 

  二、对返回给客户端的数据统一处理

     我们可以对返回给客户端数据进行特殊处理 ,如为了安全期间,对返回的数据进行加密;对返回的特殊数据进行处理等等。这个时候使用拦截器也可以简单的实现

 

第一步:创建拦截器

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;
import org.springframework.stereotype.Service;

/**
 * 
 * 对返回给客户端的结果进行处理,可以进行以下操作
 *   (1)、对返回的数据进行加密;
 *   (2)、对返回的数据进行特殊处理
 * @author  文超
 * @version  [版本号, 2012-11-7 下午03:14:39 ]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
@Service("gatewayOutInterceptor")
public class GatewayOutInterceptor extends AbstractPhaseInterceptor<Message> {
    private Logger logger = Logger.getLogger(GatewayOutInterceptor.class);
	public GatewayOutInterceptor() {
		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 result = IOUtils.toString(in,"UTF-8");
			logger.info("返回给客户端值:"+result);
			/** 这里可以对result做处理,如可以对result进行加密,把密文返回给客户端
			  处理完后同理,写回流中*/
			IOUtils.copy(new ByteArrayInputStream(result.getBytes("UTF-8")), os);

			cs.close();
			os.flush();
			message.setContent(OutputStream.class, os);
		} catch (Exception e) {
			logger.error("GatewayOutInterceptor异常",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 {}

	}

}

 

第二步:添加配置

 

<jaxrs:server id="smsGateway" address="/smsGateway">
		<jaxrs:inInterceptors>
		   <ref bean="inMessageInterceptor"/>
		   <ref bean="gatewayInInterceptor"/>
		</jaxrs:inInterceptors>
		<jaxrs:outInterceptors>
		    <ref bean="outMessageInterceptor"/>
		    <ref bean="gatewayOutInterceptor"/>
		</jaxrs:outInterceptors>
		<jaxrs:serviceBeans>
			<ref bean="smsGatewayImpl" />
		</jaxrs:serviceBeans>
		<jaxrs:extensionMappings>
			<entry key="json" value="application/json" />
			<entry key="xml" value="application/xml" />
		</jaxrs:extensionMappings>
		<jaxrs:languageMappings>
			<entry key="en" value="en-gb" />
		</jaxrs:languageMappings>
		<jaxrs:providers>
	           <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
	           <bean class="com.pml.service.outer.InvokeFaultExceptionMapper"/>
	       </jaxrs:providers>
	</jaxrs:server>

 

第三步:OK,测试一下,是否达到你相应的结果

 

 

 

分享到:
评论
9 楼 renguoliang0508 2017-02-27  
renguoliang0508 写道
你好,我又来了,按你这里的实现。POST形式中获取不到参数。请问知道什么原因吗

我已经在这篇文章中解决了。这个问题http://blog.csdn.net/renguoliang0508/article/details/56839181
8 楼 renguoliang0508 2017-02-24  
你好,我又来了,按你这里的实现。POST形式中获取不到参数。请问知道什么原因吗
7 楼 renguoliang0508 2017-02-23  
首先对您标示感谢,从拦截器的实现那篇参照做的,过程有点异常最终解决了.对我的启发很大的,尤其文章(六),我要学习之后实现参数的过滤,正在实现.
6 楼 hepro 2016-02-17  
mtom传输文件的时候会导致文件内容变化。
5 楼 FancyBai 2015-11-03  
message.QUERY_STRING 获取到的值总是“wsdl”,好像不对啊
4 楼 xinxinlong 2015-05-13  
post参数经过你的拦截器之后,参数消失了?
3 楼 ZT71363387 2015-01-19  
谢谢帮了我很大忙。
2 楼 yufenfei 2013-03-22  
hljlzc2007 写道
你好,看到您的文章很受启发,我们的项目中也用到了CXF,可以加QQ交流一下吗, QQ:2313036266

不好意思,才看到,上班期间很少连外网,所以你问题直接留言给我!
1 楼 hljlzc2007 2013-01-31  
你好,看到您的文章很受启发,我们的项目中也用到了CXF,可以加QQ交流一下吗, QQ:2313036266

相关推荐

    04.使用CXF处理JavaBean式的复合类型和List集合类型的形参和返回值

    在本文中,我们将深入探讨如何使用Apache CXF框架来处理JavaBean式的复合类型以及List集合类型的参数和返回值。CXF是一个开源的、强大的Web服务框架,它支持多种Web服务标准,包括SOAP、RESTful等,并且允许开发者以...

    Spring+cxf请求webService

    【Spring+CXF请求WebService详解】 在Java开发领域,Spring框架以其强大的依赖注入和面向切面编程能力被广泛应用,而CXF则是一个优秀的开源服务开发框架,支持SOAP和RESTful服务。当Spring与CXF结合使用时,可以...

    cxf使用中编码问题

    总之,处理CXF中的编码问题需要对字符编码有深入的理解,并且熟悉CXF框架的配置和API。通过正确配置和使用各种工具,可以有效地避免和解决编码相关的问题,确保服务的正常运行和数据的准确传递。

    CXF建立webservice服务端和客户端

    其对XML的支持使得数据交换更为规范和标准化,而与MySQL的集成则允许你将Web服务与后端数据库紧密结合,实现数据的持久化存储。在实际开发中,了解并掌握CXF的使用对于构建基于SOAP的服务是非常有价值的。

    CXF之二(上传及下载附件)

    在CXF中,实现文件上传通常涉及到创建一个Web服务接口,该接口接受Multipart请求,这允许用户发送多个部分的数据,如文本字段和文件。Multipart请求是HTTP协议的一种扩展,特别适用于处理包含不同类型数据的表单提交...

    CXF拦截器(Interceptor)的使用

    拦截器允许开发者在请求和响应的消息传递过程中插入自定义逻辑,从而在不影响核心框架的情况下,实现诸如日志记录、消息格式转换、安全性检查等复杂功能。 ### 一、基本原理 拦截器的基本工作原理可以类比于管道...

    CXF利用Json格式传输对象

    然后,在服务接口或实现类上添加`@Consumes`和`@Produces`注解,指定接受和返回JSON格式的数据。 4. CXF JSONProvider CXF还提供了内置的`org.apache.cxf.jaxrs.provider.json.JSONProvider`,可以直接处理JSON...

    spring + cxf + restful + soap 集成小项目

    URIpath参数是从请求的URI中抽取的,而且参数的名称和@Path注解中定义的变量名对应。 @QueryParam注解是可以抽取并在资源类中使用的一类参数。Query参数是从请求URI的查询参数中抽取的。 @Consumes注解是用来指定...

    CXF服务端对象文件支持断点传送

    SOAP允许开发者将复杂的对象作为参数传递给Web服务,这样服务端可以接收和处理这些参数,实现业务逻辑。这通常涉及到序列化和反序列化的过程,即将Java对象转换为XML格式,以便在网络中传输,然后在接收端再将XML...

    CXF Restful服务简单例子

    响应体:使用`@Produces`注解,可以指定返回数据的格式,如JSON、XML。\n5. 错误处理:可以定义全局的`@Provider`类来处理HTTP错误码和异常。\n\n五、CXF RESTful服务与CXF_WS文件\n在提供的压缩包文件`CXF_WS`中,...

    webservice天气预报例子cxf实例

    例如,可能有一个名为`getWeatherByCity`的方法,接收城市名作为参数,并返回相应的天气预报数据。 接下来,压缩包中的`webTest`可能包含以下组件: 1. **源代码**:Java源文件,包括服务接口、实现和服务配置。 2....

    Apache CXF + Spring3 + REST + JSON配置

    在"Apache CXF + Spring3 + REST + JSON配置"中,我们主要探讨如何利用Apache CXF和Spring 3框架来构建RESTful服务,并使用JSON作为数据交换格式。以下是一些关键知识点: 1. **Spring 3集成CXF**: - 首先,你...

    CXF客户端测试需要的最少JAR包

    通过使用CXF提供的工具或编程方式,我们可以快速地创建并执行这些测试,验证客户端是否能正确地与服务器进行通信,以及接收和处理返回的数据。在测试过程中,还可以利用CXF的日志功能来追踪和调试可能出现的问题,...

    CXF restful风格WebService

    - **数据绑定**:使用`@PathParam`、`@QueryParam`、`@FormParam`等注解处理请求参数。 - **响应状态码**:使用`@ResponseStatus`注解返回特定的HTTP状态码。 - **异常处理**:自定义异常类和使用`@Provider`注解的...

    cxf的webservice的客户端代码

    总的来说,这个主题涵盖了CXF框架如何作为客户端与Web服务进行交互,包括SOAP和RESTful通信方式,以及XML和JSON数据的处理。了解和掌握这些知识点对于开发和维护与Web服务接口相关的应用程序至关重要。

    Cxf应用整理学习资料

    总结,CXF提供了强大的功能支持,无论是简单的文本消息还是复杂的对象数据,都可以通过其提供的工具和技术轻松实现。对于初学者来说,掌握基本的HelloWorld示例是入门的关键,而理解复杂对象的传递则有助于处理更...

    cxf教程

    服务器接收到请求后,根据SOAP消息的内容进行处理,并返回同样格式的响应。这一过程高度依赖于XML的标准化表达能力,以及SOAP与WSDL之间的紧密协作,实现了异构系统间的数据交换和服务调用。 #### 结论 CXF框架...

    实现CXF框架源代码

    CXF是一个流行的开源项目,它提供了一种简单的方式来创建和消费Web服务。通过CXF,开发者可以利用SOAP或RESTful风格来构建服务,同时支持多种协议和绑定格式。 首先,我们来看`Server.java`文件,这是Web服务的...

    cxf集成Spring的restful WebService接口以Json形式表现

    本项目主要展示了如何使用CXF和Spring构建一个能够以JSON格式返回数据的RESTful WebService接口。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它...

    CXF服务端和客户端 应用开发指南

    此外,还需配置CXF的Bus实例,这是CXF框架的核心组件,负责处理服务请求的路由和转换。 #### 五、服务发布与客户端调用 服务发布后,客户端可通过调用特定的URL访问服务。CXF支持多种客户端编程模型,包括JAX-WS和...

Global site tag (gtag.js) - Google Analytics