一、对客户端上送的参数统一处理
最近有人提出来这样的需求,通过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,测试一下,是否达到你相应的结果
分享到:
相关推荐
CXF发布的REST服务返回JSON格式数据,只有服务端代码,没有客户端代码,可以通过http://localhost:9999/roomservice/room、http://localhost:9999/roomservice/room/001来访问测试数据。
CXF处理复杂类型,关于接口的处理,这里是从网上搜索整理的资料,看看吧
04.使用CXF处理JavaBean式的复合类型和List集合类型的形参和返回值
URIpath参数是从请求的URI中抽取的,而且参数的名称和@Path注解中定义的变量名对应。 @QueryParam注解是可以抽取并在资源类中使用的一类参数。Query参数是从请求URI的查询参数中抽取的。 @Consumes注解是用来指定...
cxf soap header cxf soap header cxf soap header cxf soap header
JAVA7和JAVA8对应CXF资源 WebService CXF 用了一天时间找,官网打不开,国内要积分,下下来又永不了。最后终于搞到手,上传上来分享给大家。 jdk版本 CXF版本 java 9及以上 3.3.x java 8 3.x java 7 2.2x --- ...
里面有数据库,java版本
通过cxf将多个webServices整合到一起方便管理与维护
cxf 请求webService 方式 xml
未引用spring, 单纯cxf restful 使用,只写了返回json数据的一个简单get请求例子
Web Service、CXF跨平台和跨语言的通信
webservice cxf 里面的分为2部分 服务器端项目 客户端demo 测试个各种传递参数的test类 适合初学者 情况readme txt
CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First...
webservice cxf spring整合返回list,bean,string,json,xml项目完整实例
Axis和CXF的比较.txtAxis和CXF的比较.txtAxis和CXF的比较.txt
实战Web Service 之 CXF 实战Web Service 之 CXF
CXF spring 提供rest服务输出xml或json等格式数据
启动后访问http://localhost:8080/cxf-ws-restful-spring-server/ws63
1.使用Java 2.用cxf开发webservice ...客户端也需要接口类文件和pojo,和cxf客户端xml 但是没有接口的实现类,就是为了去服务端来调用的。 具体有不懂可以问我 给我发消息, 劳烦评价 ,请大家支持原创 禁止转载
详细描述了cxf如何处理Map等不能处理的类型