CXF 拦截器 拦截请求和发送时的报文
参考:https://blog.csdn.net/yczz/article/details/16809859#commentBox
http://cxf.apache.org/docs/interceptors.html
https://elim.iteye.com/blog/2248620#_Toc431737707
cxf 可以对请求和发送时的报文进行拦截,然后对其进行加工成我们想要的格式,然后再放到回去!!!!!
我实现的是自定义拦截器
1.在需要拦截的方法上面加上这个注解,注解里面是我们的自定义拦截器
@OutInterceptors(interceptors = { "com.deloitte.tms.vat.webservice.result1.CDATAOutInterceptor" }) @InInterceptors(interceptors="com.deloitte.tms.vat.webservice.result1.ArtifactOutInterceptor")
2.对返回时的格式进行拦截实例,如果
public CDATAOutInterceptor() { //这里代表流关闭之前的阶段,这很重要!可以到官网去看,拦截的阶段分为很多种super(Phase.PRE_STREAM); }
Phase.PRE_STREAM写的阶段不对可能会对想要的结果有影响,我开始写的Send和Write都是不生效的,网上也有好多博文写的是这种!!!踩到坑了!
import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;import org.apache.cxf.helpers.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.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;public class CDATAOutInterceptor extends AbstractPhaseInterceptor<Message> {private static final Logger log = LogManager.getLogger(ArtifactOutInterceptor.class);public CDATAOutInterceptor() { //这里代表流关闭之前的阶段,这很重要!可以到官网去看,拦截的阶段分为很多种super(Phase.PRE_STREAM);}@Overridepublic void handleMessage(Message message) {/*这里是通过注解的方式来加<!CDATA[[]]>的格式* message.put("disable.outputstream.optimization", Boolean.TRUE);* XMLStreamWriter writer =* StaxUtils.createXMLStreamWriter(message.getContent(OutputStream.class* )); message.setContent(XMLStreamWriter.class, new* CDATAXMLStreamWriter(writer));*/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 xml = IOUtils.toString(in);System.out.println("replaceBegin" + xml);//转换的方式xml = xml.replace("<body>", "<![CDATA[<?xml version=\"1.0\" encoding=\"UTF-8\"?><body>") .replace("<returnMessage>", "<returnMessage><![CDATA[").replace("</returnMessage>", "]]></returnMessage>").replace("<returnCode>", "<returnCode><![CDATA[").replace("</returnCode>", "]]></returnCode>");// 这里对xml做处理,处理完后同理,写回流中System.out.println("replaceAfter" + xml);IOUtils.copy(new ByteArrayInputStream(xml.getBytes()), os);cs.close();os.flush();message.setContent(OutputStream.class, os);} catch (Exception e) {log.error("Error when split original inputStream. CausedBy : " + "\n" + 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获取不到数据的情况。需要将CachedStream换成ByteArrayOutputStream,
如下的方式:
1 @Override 2 public void handleMessage(Message message) { 3 try { 4 5 OutputStream os = message.getContent(OutputStream.class); 6 ByteArrayOutputStream cs=new ByteArrayOutputStream(); 7 8 message.setContent(OutputStream.class, cs); 9 10 message.getInterceptorChain().doIntercept(message); 11 12 //ByteArrayOutputStream csnew = (ByteArrayOutputStream) message.getContent(ByteArrayOutputStream.class); 13 //InputStream in = csnew.toString(charsetName); 14 //String xml = IOUtils.toString(in); 15 String xml=new String(cs.toByteArray(), "utf-8"); 16 log.info("replaceBegin"+xml); 17 xml = xml.replace(""0; 18 // 这里对xml做处理,处理完后同理,写回流中 19 log.info("replaceAfter"+xml); 20 IOUtils.copy(new ByteArrayInputStream(xml.getBytes()), os); 21 cs.close(); 22 os.flush(); 23 log.info("将参数设置会cxf框架中------------"); 24 message.setContent(OutputStream.class, os); 25 26 } catch (Exception e) { 27 log.error("Error when split original inputStream. CausedBy : " + "\n" + e); 28 } 29 }
3.对请求进行拦截
import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream;import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.helpers.IOUtils; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class ArtifactOutInterceptor extends AbstractPhaseInterceptor<SoapMessage>{private static final Logger log = LogManager.getLogger(ArtifactOutInterceptor.class); public ArtifactOutInterceptor() { //这儿使用pre_stream,意思为在流关闭之前 super(Phase.PRE_STREAM); } @Overridepublic void handleMessage(SoapMessage message) {InputStream is = message.getContent(InputStream.class);if (is != null) {try {String str = IOUtils.toString(is);log.info("原格式--传入的xml格式为:"+str);str=str.replace("<", "<");str=str.replace(">", ">");str=str.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>","");InputStream ism = new ByteArrayInputStream(str.getBytes());message.setContent(InputStream.class, ism);log.info("解析后的格式--传入的xml格式为:"+str);}catch(IOException e){log.error("WebService消息拦截器处理异常!",e);}}} }
4.1.对输出加<CADATA[[]]>的另外一种方法
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.xml.stream.XMLStreamWriter;
import org.apache.cxf.helpers.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.cxf.staxutils.StaxUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class CDATAOutInterceptor extends AbstractPhaseInterceptor<Message> {
private static final Logger log = LogManager.getLogger(ArtifactOutInterceptor.class);
public CDATAOutInterceptor() {
super(Phase.PRE_STREAM);
}
@Override
public void handleMessage(Message message) {
message.put("disable.outputstream.optimization", Boolean.TRUE);
XMLStreamWriter writer =
StaxUtils.createXMLStreamWriter(message.getContent(OutputStream.class
)); message.setContent(XMLStreamWriter.class, new
CDATAXMLStreamWriter(writer));
}
}
import java.util.Arrays;import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter;import org.apache.cxf.staxutils.DelegatingXMLStreamWriter;public class CDATAXMLStreamWriter extends DelegatingXMLStreamWriter{private String currentElementName;private static String[] CDATA_ELEMENTS = { "returnCode", "returnMessage","fpdm", "fphm","code", "smrq","kpfsh","kprq","fpje","fpse", "sl","spfsh", "spfmc","fply","fplx", "xgrq","zfbz" , "rzrq","rzzt","body","start_time","end_time"};public CDATAXMLStreamWriter(XMLStreamWriter writer) {super(writer);}@Overridepublic void writeCharacters(String text) throws XMLStreamException {boolean useCData = isNeedCData();if (useCData) {super.writeCData(text);} else {super.writeCharacters(text);}}private boolean isNeedCData() {if(currentElementName.equals("body")||currentElementName.equals("data")){System.out.println("-------");}if (Arrays.asList(CDATA_ELEMENTS).contains(currentElementName)) {return true;} else {return false;}}public void writeStartElement(String prefix, String local, String uri)throws XMLStreamException {currentElementName = local;super.writeStartElement(prefix, local, uri);} }
转载于:https://www.cnblogs.com/fengxiaoyuan/p/10683806.html
CXF 拦截器 拦截请求和发送时的报文相关推荐
- 拦截器获取请求参数post_SpringBoot拦截器如何获取http请求参数
1.1.获取http请求参数是一种刚需 我想有的小伙伴肯定有过获取http请求的需要,比如想 前置获取参数,统计请求数据 做服务的接口签名校验 敏感接口监控日志 敏感接口防重复提交 等等各式各样的场景 ...
- Aop做拦截器 获取请求头数据 修改请求数据拦截返回值修改返回值数据
AOP 拦截器拦截请求头 修改请求参数 请求数据拦截 本页面 按住 ctrl 和 F 搜索 @Before("doPointcut()") 返回值数据拦截 本页面 按住 ctrl ...
- axios config里自定义属性,使用拦截器拦截,无法拿到自定义属性问题
axios config里自定义属性,使用拦截器拦截,无法拿到自定义属性问题 最新版本axios限制了键,对键值做了白名单处理. 解决思路: 修改源码中的内容,添加一个键来报错额外属性. 或者:使用老 ...
- 在JSP中常见问题,防止SpringMVC拦截器拦截js等静态资源文件的解决方案
在JSP中常见问题,防止SpringMVC拦截器拦截js等静态资源文件的解决方案 参考文章: (1)在JSP中常见问题,防止SpringMVC拦截器拦截js等静态资源文件的解决方案 (2)https: ...
- 【项目经验】拦截器拦截入参出参
文章目录 拦截器拦截入参出参 入参 出参 拦截器拦截入参出参 入参 @Overridepublic boolean preHandle(HttpServletRequest request, Http ...
- spring拦截器 拦截和排除接口冲突
以下为springboot案例: 场景: 某个规则下的绝大部分接口路径不需要经过拦截器, 但其中的某几个接口又需要经过拦截器. 例如: "/api/register/**" 模式 ...
- 5 拦截器拦截请求路由_手写简易版axios拦截器,实现微信小程序wx.request的封装与拦截...
前言: axios是一个功能强大的网络请求库,其中拦截器又是axios的精髓.在小程序的开发或者需要手动实现ajax的时候,没有实现对请求的拦截,开发的时候非常不方便,因此手写一个简易版的axios拦 ...
- Vue中使用axios的响应拦截器处理请求失败的情况(处理token过期问题)以及 登录成功跳转回原来页面问题
参考axios官方文档 // 响应拦截器 // Add a response interceptor request.interceptors.response.use(// 在2xx范围内的任何状态 ...
- vue拦截器及请求封装
1.vue项目的src文件夹中创建request文件夹 (1)request文件夹中创建index.js (拦截器主要代码) /*** 请求封装*/import axios from 'axios'; ...
最新文章
- mac redies install
- 天才也勤奋!DeepMind哈萨比斯自述:领导400名博士向前,每天工作至凌晨4点
- ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新(转载)
- mysql条件填充命令_mysql的简单命令
- 《深度探索C++对象模型》--1 关于对象
- 涌之势,智造未来, 戴尔科技集团携新一代信息技术解决方案赋能“新基建”
- leetcode191-打家劫舍
- 2012/7/26给Extjs grid中的列自定义渲染方式
- javaweb获取客户端IP
- linux系统 删除文件命令
- google浏览器截取长图
- Perl,第一种后现代计算机语言
- Easyui之datagrid修改
- 回归模型+自变量和因变量之间的关系、回归模型的种类、回归模型的输出类型、个数角度
- 置信区间 VS 置信水平
- Hexo主题next中添加天气插件(心知天气)
- 香橙派 lite 2 使用OV5640
- 如何部署搭建app服务端运行环境(java)?
- 微信搜一搜将开放搜索入口给搜狗搜索
- cpu功能解析,cpu功能作用与其工作过程