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

来源:互联网 发布:软件开发报价模板 编辑:程序博客网 时间:2024/06/05 05:04

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

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

第一步:创建拦截器

 

Java代码  收藏代码
  1. import java.io.ByteArrayInputStream;  
  2. import java.io.InputStream;  
  3. import java.util.HashMap;  
  4. import java.util.Iterator;  
  5. import java.util.Map;  
  6. import org.apache.cxf.interceptor.Fault;  
  7. import org.apache.cxf.message.Message;  
  8. import org.apache.cxf.phase.AbstractPhaseInterceptor;  
  9. import org.apache.cxf.phase.Phase;  
  10. import org.apache.log4j.Logger;  
  11. import org.springframework.stereotype.Service;  
  12.   
  13.   
  14. /** 
  15.  * 对客户端上送的数据进行处理,可以完成以下功能 
  16.  * (1)、对加密的字段统一加密; 
  17.  * (2)、对特殊的字段进行特殊处理 
  18.  *  
  19.  * @author  XX 
  20.  * @version  [版本号, 2012-11-07 下午02:34:07 ] 
  21.  * @see  [相关类/方法] 
  22.  * @since  [产品/模块版本] 
  23.  */  
  24. @Service("gatewayInInterceptor")  
  25. public class GatewayInInterceptor extends AbstractPhaseInterceptor<Message> {  
  26.     private Logger logger = Logger.getLogger(GatewayInInterceptor.class);  
  27.     public GatewayInInterceptor(String phase) {  
  28.         super(phase);  
  29.     }  
  30.       
  31.     public GatewayInInterceptor() {  
  32.         super(Phase.RECEIVE);  
  33.     }  
  34.   
  35.     /** <功能详细描述> 
  36.      * 创 建 人:  XX 
  37.      * 创建时间:  2012-11-07 下午02:34:07   
  38.      * @param arg0 
  39.      * @throws Fault 
  40.      * @see [类、类#方法、类#成员] 
  41.      */  
  42.     @SuppressWarnings("static-access")  
  43.     public void handleMessage(Message message) throws Fault {  
  44.   
  45.         /* Iterator<Entry<String, Object>> it = message.entrySet().iterator(); 
  46.         while (it.hasNext()) { 
  47.             Entry<String, Object> e = it.next(); 
  48.             System.out.println(e.getKey() + "," + e.getValue()); 
  49.         }*/  
  50.         String reqParams=null;  
  51.          if(message.get(message.HTTP_REQUEST_METHOD).equals("GET")){//采用GET方式请求  
  52.              reqParams=(String) message.get(message.QUERY_STRING);  
  53.              message.remove(message.QUERY_STRING);  
  54.              reqParams=this.getParams(this.getParamsMap(reqParams));  
  55.              message.put(message.QUERY_STRING,reqParams);  
  56.                
  57.          }else if(message.get(message.HTTP_REQUEST_METHOD).equals("POST")){//采用POST方式请求  
  58.              try {  
  59.                  InputStream is = message.getContent(InputStream.class);  
  60.                  reqParams=this.getParams(this.getParamsMap(is.toString()));  
  61.                     if (is != null)  
  62.                         message.setContent(InputStream.classnew ByteArrayInputStream(reqParams.getBytes()));  
  63.                 } catch (Exception e) {  
  64.                     logger.error("GatewayInInterceptor异常",e);  
  65.                 }  
  66.          }  
  67.          logger.info("请求的参数:"+reqParams);  
  68.     }  
  69.       
  70.     private Map<String,String> getParamsMap(String strParams){  
  71.         if(strParams==null||strParams.trim().length()<=0){  
  72.             return null;  
  73.         }  
  74.         Map<String,String> map =new HashMap<String,String>();  
  75.         String[] params=strParams.split("&");  
  76.         for(int i=0;i<params.length;i++){  
  77.             String[] arr=params[i].split("=");  
  78.             map.put(arr[0], arr[1]);  
  79.         }  
  80.         return map;  
  81.     }  
  82.       
  83.     private String getParams(Map<String,String> map){  
  84.         if(map==null||map.size()==0){  
  85.             return null;  
  86.         }  
  87.         StringBuffer sb=new StringBuffer();  
  88.         Iterator<String> it =map.keySet().iterator();  
  89.         while(it.hasNext()){  
  90.             String key=it.next();  
  91.             String value =map.get(key);  
  92.             /*这里可以对客户端上送过来的输入参数进行特殊处理。如密文解密;对数据进行验证等等。。。 
  93.             if(key.equals("content")){ 
  94.                 value.replace("%3D", "="); 
  95.                 value = DesEncrypt.convertPwd(value, "DES"); 
  96.             }*/  
  97.             if(sb.length()<=0){  
  98.                 sb.append(key+"="+value);  
  99.             }else{  
  100.                 sb.append("&"+key+"="+value);  
  101.             }  
  102.         }  
  103.         return sb.toString();  
  104.     }  
  105.   
  106. }  

 

第二步:修改配置文件

 

Xml代码  收藏代码
  1. <jaxrs:server id="smsGateway" address="/smsGateway">  
  2.         <jaxrs:inInterceptors>  
  3.            <ref bean="inMessageInterceptor"/>  
  4.            <ref bean="gatewayInInterceptor"/>  
  5.         </jaxrs:inInterceptors>  
  6.         <jaxrs:outInterceptors>  
  7.             <ref bean="outMessageInterceptor"/>  
  8.          </jaxrs:outInterceptors>  
  9.         <jaxrs:serviceBeans>  
  10.             <ref bean="smsGatewayImpl" />  
  11.         </jaxrs:serviceBeans>  
  12.         <jaxrs:extensionMappings>  
  13.             <entry key="json" value="application/json" />  
  14.             <entry key="xml" value="application/xml" />  
  15.         </jaxrs:extensionMappings>  
  16.         <jaxrs:languageMappings>  
  17.             <entry key="en" value="en-gb" />  
  18.         </jaxrs:languageMappings>  
  19.         <jaxrs:providers>  
  20.                <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>  
  21.                <bean class="com.pml.service.outer.InvokeFaultExceptionMapper"/>  
  22.            </jaxrs:providers>  
  23.     </jaxrs:server>  

 

 第三步:测试一下

 

 

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

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

 

第一步:创建拦截器

Java代码  收藏代码
  1. import java.io.ByteArrayInputStream;  
  2. import java.io.IOException;  
  3. import java.io.InputStream;  
  4. import java.io.OutputStream;  
  5.   
  6. import org.apache.commons.io.IOUtils;  
  7. import org.apache.cxf.io.CachedOutputStream;  
  8. import org.apache.cxf.message.Message;  
  9. import org.apache.cxf.phase.AbstractPhaseInterceptor;  
  10. import org.apache.cxf.phase.Phase;  
  11. import org.apache.log4j.Logger;  
  12. import org.springframework.stereotype.Service;  
  13.   
  14. /** 
  15.  *  
  16.  * 对返回给客户端的结果进行处理,可以进行以下操作 
  17.  *   (1)、对返回的数据进行加密; 
  18.  *   (2)、对返回的数据进行特殊处理 
  19.  * @author  文超 
  20.  * @version  [版本号, 2012-11-7 下午03:14:39 ] 
  21.  * @see  [相关类/方法] 
  22.  * @since  [产品/模块版本] 
  23.  */  
  24. @Service("gatewayOutInterceptor")  
  25. public class GatewayOutInterceptor extends AbstractPhaseInterceptor<Message> {  
  26.     private Logger logger = Logger.getLogger(GatewayOutInterceptor.class);  
  27.     public GatewayOutInterceptor() {  
  28.         super(Phase.PRE_STREAM);    // 触发点在流关闭之前  
  29.     }  
  30.   
  31.     public void handleMessage(Message message) {  
  32.         try {  
  33.             OutputStream os = message.getContent(OutputStream.class);  
  34.             CachedStream cs = new CachedStream();  
  35.             message.setContent(OutputStream.class, cs);  
  36.             message.getInterceptorChain().doIntercept(message);  
  37.             CachedOutputStream csnew = (CachedOutputStream) message.getContent(OutputStream.class);  
  38.             InputStream in = csnew.getInputStream();  
  39.   
  40.             String result = IOUtils.toString(in,"UTF-8");  
  41.             logger.info("返回给客户端值:"+result);  
  42.             /** 这里可以对result做处理,如可以对result进行加密,把密文返回给客户端 
  43.               处理完后同理,写回流中*/  
  44.             IOUtils.copy(new ByteArrayInputStream(result.getBytes("UTF-8")), os);  
  45.   
  46.             cs.close();  
  47.             os.flush();  
  48.             message.setContent(OutputStream.class, os);  
  49.         } catch (Exception e) {  
  50.             logger.error("GatewayOutInterceptor异常",e);  
  51.         }  
  52.     }  
  53.   
  54.     private class CachedStream extends CachedOutputStream {  
  55.         public CachedStream() {super();}  
  56.   
  57.         protected void doFlush() throws IOException {  
  58.             currentStream.flush();  
  59.         }  
  60.         protected void doClose() throws IOException {}  
  61.         protected void onWrite() throws IOException {}  
  62.   
  63.     }  
  64.   
  65. }  

 

第二步:添加配置

 

Xml代码  收藏代码
  1. <jaxrs:server id="smsGateway" address="/smsGateway">  
  2.         <jaxrs:inInterceptors>  
  3.            <ref bean="inMessageInterceptor"/>  
  4.            <ref bean="gatewayInInterceptor"/>  
  5.         </jaxrs:inInterceptors>  
  6.         <jaxrs:outInterceptors>  
  7.             <ref bean="outMessageInterceptor"/>  
  8.             <ref bean="gatewayOutInterceptor"/>  
  9.         </jaxrs:outInterceptors>  
  10.         <jaxrs:serviceBeans>  
  11.             <ref bean="smsGatewayImpl" />  
  12.         </jaxrs:serviceBeans>  
  13.         <jaxrs:extensionMappings>  
  14.             <entry key="json" value="application/json" />  
  15.             <entry key="xml" value="application/xml" />  
  16.         </jaxrs:extensionMappings>  
  17.         <jaxrs:languageMappings>  
  18.             <entry key="en" value="en-gb" />  
  19.         </jaxrs:languageMappings>  
  20.         <jaxrs:providers>  
  21.                <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>  
  22.                <bean class="com.pml.service.outer.InvokeFaultExceptionMapper"/>  
  23.            </jaxrs:providers>  
  24.     </jaxrs:server>  

 

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

阅读全文
0 0
原创粉丝点击