CXF之六(对请求参数和返回给客户数据处理)
来源:互联网 发布:软件开发报价模板 编辑:程序博客网 时间:2024/06/05 05:04
一、对客户端上送的参数统一处理
最近有人提出来这样的需求,通过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,测试一下,是否达到你相应的结果
阅读全文
0 0
- CXF之六(对请求参数和返回给客户数据处理)
- c#ajax请求返回数据处理(二)
- Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理
- ajax 异步请求后台返回字符串赋值给js参数
- cxf InInterceptor 获取请求参数
- RetroFit请求参数和返回格式说明
- 带 参数 ajax请求(利用getjson方法按客户id来请求客户信息)
- Spring Mvc获取请求参数和 返回参数和注解
- 18-ajax学习之返回数据处理xml和json
- 网络请求处理与数据处理返回对象
- ajaxfileupload.js 请求返回json数据处理错误
- Android之请求码和返回码
- springAop实现日志请求参数和返回结果打印
- ajax对服务器大气请求和接收返回信息
- SoapUI+Groovy获取返回值并作为参数传递给另一个用例-基于Post请求
- springmvc 通过异常增强返回给客户端统一格式 springmvc请求参数异常处理
- CXF实战之传输文件(六)
- Spring In Action(六):处理请求中的参数
- 软件工程导论第二章作业2.2
- Find Median from Data Stream
- 预习《高质量嵌入式LinuxC编程》第二章有感
- C++“类”小练习
- lca 离线模板
- CXF之六(对请求参数和返回给客户数据处理)
- golang fmt.Stringer 接口的使用
- VS2013导入opencv320配置属性文件
- Constructing Roads In JGShining's Kingdom(二分法维护单调上升序列)
- 操作系统:进程同步(1)进程同步概念
- 类的抽象性知识点和示例
- POJ2993 Emag eht htiw Em Pleh
- php使用qq第三方登陆(oauth协议)
- 海量数据按行数进行切分