参考: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("&lt;", "<");str=str.replace("&gt;", ">");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 拦截器 拦截请求和发送时的报文相关推荐

  1. 拦截器获取请求参数post_SpringBoot拦截器如何获取http请求参数

    1.1.获取http请求参数是一种刚需 我想有的小伙伴肯定有过获取http请求的需要,比如想 前置获取参数,统计请求数据 做服务的接口签名校验 敏感接口监控日志 敏感接口防重复提交 等等各式各样的场景 ...

  2. Aop做拦截器 获取请求头数据 修改请求数据拦截返回值修改返回值数据

    AOP 拦截器拦截请求头 修改请求参数 请求数据拦截 本页面 按住 ctrl 和 F 搜索 @Before("doPointcut()") 返回值数据拦截 本页面 按住 ctrl ...

  3. axios config里自定义属性,使用拦截器拦截,无法拿到自定义属性问题

    axios config里自定义属性,使用拦截器拦截,无法拿到自定义属性问题 最新版本axios限制了键,对键值做了白名单处理. 解决思路: 修改源码中的内容,添加一个键来报错额外属性. 或者:使用老 ...

  4. 在JSP中常见问题,防止SpringMVC拦截器拦截js等静态资源文件的解决方案

    在JSP中常见问题,防止SpringMVC拦截器拦截js等静态资源文件的解决方案 参考文章: (1)在JSP中常见问题,防止SpringMVC拦截器拦截js等静态资源文件的解决方案 (2)https: ...

  5. 【项目经验】拦截器拦截入参出参

    文章目录 拦截器拦截入参出参 入参 出参 拦截器拦截入参出参 入参 @Overridepublic boolean preHandle(HttpServletRequest request, Http ...

  6. spring拦截器 拦截和排除接口冲突

    以下为springboot案例: 场景:  某个规则下的绝大部分接口路径不需要经过拦截器, 但其中的某几个接口又需要经过拦截器. 例如: "/api/register/**" 模式 ...

  7. 5 拦截器拦截请求路由_手写简易版axios拦截器,实现微信小程序wx.request的封装与拦截...

    前言: axios是一个功能强大的网络请求库,其中拦截器又是axios的精髓.在小程序的开发或者需要手动实现ajax的时候,没有实现对请求的拦截,开发的时候非常不方便,因此手写一个简易版的axios拦 ...

  8. Vue中使用axios的响应拦截器处理请求失败的情况(处理token过期问题)以及 登录成功跳转回原来页面问题

    参考axios官方文档 // 响应拦截器 // Add a response interceptor request.interceptors.response.use(// 在2xx范围内的任何状态 ...

  9. vue拦截器及请求封装

    1.vue项目的src文件夹中创建request文件夹 (1)request文件夹中创建index.js (拦截器主要代码) /*** 请求封装*/import axios from 'axios'; ...

最新文章

  1. mac redies install
  2. 天才也勤奋!DeepMind哈萨比斯自述:领导400名博士向前,每天工作至凌晨4点
  3. ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新(转载)
  4. mysql条件填充命令_mysql的简单命令
  5. 《深度探索C++对象模型》--1 关于对象
  6. 涌之势,智造未来, 戴尔科技集团携新一代信息技术解决方案赋能“新基建”
  7. leetcode191-打家劫舍
  8. 2012/7/26给Extjs grid中的列自定义渲染方式
  9. javaweb获取客户端IP
  10. linux系统 删除文件命令
  11. google浏览器截取长图
  12. Perl,第一种后现代计算机语言
  13. Easyui之datagrid修改
  14. 回归模型+自变量和因变量之间的关系、回归模型的种类、回归模型的输出类型、个数角度
  15. 置信区间 VS 置信水平
  16. Hexo主题next中添加天气插件(心知天气)
  17. 香橙派 lite 2 使用OV5640
  18. 如何部署搭建app服务端运行环境(java)?
  19. 微信搜一搜将开放搜索入口给搜狗搜索
  20. cpu功能解析,cpu功能作用与其工作过程

热门文章

  1. idea antlr4 使用
  2. 功能安全——E2E应用层实现
  3. 宝塔安装docker 安装pip
  4. C语言实现字符串倒置
  5. kaldi学习 - 一脚本流学习工具使用
  6. Scrapy实现微博关键词爬虫(爬虫结果写入mongodb)
  7. 原生RedHat OpenStack搭建
  8. 使用AutoIt自动登录sina新浪网页邮箱的代码
  9. Licode-SFU的架构
  10. 原生js 解决offsetX兼容性问题