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

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

第一步:创建拦截器

Java代码 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 {

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> it = message.entrySet().iterator();

while (it.hasNext()) {

Entry 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 getParamsMap(String strParams){

if(strParams==null||strParams.trim().length()<=0){

return null;

}

Map map =new HashMap();

String[] params=strParams.split("&");

for(int i=0;i

String[] arr=params[i].split("=");

map.put(arr[0], arr[1]);

}

return map;

}

private String getParams(Map map){

if(map==null||map.size()==0){

return null;

}

StringBuffer sb=new StringBuffer();

Iterator 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();

}

}

第二步:修改配置文件

Xml代码

第三步:测试一下

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

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

第一步:创建拦截器

Java代码 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 {

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 {}

}

}

第二步:添加配置

Xml代码

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

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

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

第一步:创建拦截器

Java代码 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 {

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> it = message.entrySet().iterator();

while (it.hasNext()) {

Entry 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 getParamsMap(String strParams){

if(strParams==null||strParams.trim().length()<=0){

return null;

}

Map map =new HashMap();

String[] params=strParams.split("&");

for(int i=0;i

String[] arr=params[i].split("=");

map.put(arr[0], arr[1]);

}

return map;

}

private String getParams(Map map){

if(map==null||map.size()==0){

return null;

}

StringBuffer sb=new StringBuffer();

Iterator 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();

}

}

第二步:修改配置文件

Xml代码

第三步:测试一下

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

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

第一步:创建拦截器

Java代码 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 {

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 {}

}

}

第二步:添加配置

Xml代码

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

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐