首先 我们的目的是做一个拦截器 能够对http请求做profiler,能够记录本次的调用情况,这里说下如何从http请求中获取到出参的问题。

方案一:参照http://blog.csdn.net/wuhenzhangxing/article/details/53079458

该方案中,使用了HttpServletResponseWrapper,也就是HttpServletResponse的装饰器,相当一是一个代理,当业务中对response做写入的时候,会被装饰器拦截下来做个处理,比如输出到另外的一个ByteArrayOutputSteam中。然后我们就可以获取到指定的值了。

这种方案,使用的是标准的servlet api,比较标准 但是感觉还是有个小麻烦。

方案二:既然反射的功能那么强大  那么我们能不能用反射来做呢?

上代码:

    /*获取http出参*/
private String getOutputSteamContentForTomcat7(ServletResponse response) {
try {
OutputStream outputStream = response.getOutputStream();
Object contentHolder = ReflectUtil.getFiledValue(outputStream, "ob");
//获取到buffer 然后从buffer中获取到返回值
Object result = ReflectUtil.getFiledValue(contentHolder, "outputChunk");
String resultString = result == null ? StringUtils.EMPTY : result.toString();
if (StringUtils.startsWith(resultString, "<html>")) {
//含有html文本
return "HTML-CONTENT";
}
return resultString;
} catch (Exception e) {
LoggerUtils.error(logger, e, "获取WEB返回内容异常");
return StringUtils.EMPTY;
}

该方法中 使用反射来获取,但是坏处也非常明显,由于不是使用的标准的API接口 会导致tomcat版本不同 内部的类结构不同而导致获取不到 但是实现起来比较简单。经过测试,对于tomcat6和tomcat7是兼容的 但是tomcat8非兼容

使用filter获取http请求的出参以及入参的更多相关文章

  1. shell 脚本中的入参获取与判断

    1.获取shell脚本的入参个数: $# 2.获取shell脚本的第n个入参的字符个数/字符串长度(注意这里的n需要替换为具体的数字,如果这个数字超过实际的入参个数,结果为0): ${#n}

  2. 命令行通过入参调用jar包

    命令行通过入参调用jar包 最近因为项目需要,需要实现一个功能,即定时执行服务器上的一个脚本去对数据库的数据进行业务处理,要操作的数据库有很多种,mysql.db2.oracle.sqlserver等 ...

  3. Web API入参,响应规范

    入参绑定 入参应该定义成实体,而不是多个参数,方便扩展.[FromBody]和[FromUrl]特性也最好加上. public ActionResult<Pet> Create([From ...

  4. Spring AOP 自定义注解获取http接口及WebService接口入参和出参

    注解方法实现过程中可以采用如下获取方式:—以下为例  HttpServletRequest request = ((ServletRequestAttributes) RequestContextHo ...

  5. Saiku根据入参日期查询出对应的数据(二十)

    Saiku根据入参日期查询出对应的数据 之前好像有写过一篇博客关于saiku date range的,现在进一步更新啦!!! 这里的日期筛选会更完善一些,需要提供两个参数 开始日期与结束日期(star ...

  6. C#爬虫之通过Selenium获取浏览器请求响应结果

    前言 在进行某些爬虫任务的时候,我们经常会遇到仅用Http协议难以攻破的情况,比如协议中带有加密参数,破解需要花费大量时间,那这时候就会用Selenium去模拟浏览器进行页面上的元素抓取 大多数情况下 ...

  7. 解决Spring Boot中,通过filter打印post请求的 request body 问题

    http://slackspace.de/articles/log-request-body-with-spring-boot/ (filter + RequestWrapper:最优雅的写法) ht ...

  8. springMVC中 request请求数据绑定到Controller入参 过程剖析

    前言:Controller方法的参数类型可以是基本类型,也可以是封装后的普通Java类型.若这个普通Java类型没有声明任何注解,则意味着它的每一个属性都需要到Request中去查找对应的请求参数.众 ...

  9. 【openresty】获取post请求数据FormInputNginxModule模块

    关于openresty的一些介绍看这里. 首先,实验背景为openresty作为后台来处理前台post传递的数据. 在openresty内,有一个FormInputNginxModule模块,作用是解 ...

随机推荐

  1. word页码上加横线&&word删除单页页眉

    word(2010)页码上加横线 插入——>页脚(选择年刊型)——>如图 然后拖住“竖条条”将页码拖到正中间——>点中页脚右击——>选中“表格属性”——>“边框和底纹”— ...

  2. 前端Javascript书籍分享

    早前在公司曾做过一些关于前端的技术分享,而每每跟大家谈到深处时,大家会疑惑这些知识点从何而来. 我会经常在内部去推荐自己读过的好书,希望大家在技术层面上都能更上一个台阶. 今天写下这个帖子一方面是记录 ...

  3. Codeforces554 C Kyoya and Colored Balls

    C. Kyoya and Colored Balls Time Limit: 2000ms Memory Limit: 262144KB 64-bit integer IO format: %I64d ...

  4. win7下利用VM8安装CentOS6.3配置静态IP上网

    1 环境 宿主主机64位win7,利用VM8安装的64位CentOS6.3,64位的.在VM中配置CentOS的IP为静态,可上互联网.具体配置过程如下. 2 步骤 首先将VM的setting选项中, ...

  5. Java 枚举7常见种用法

    DK1.5引入了新的类型--枚举.在 Java 中它虽然算个"小"功能,却给我的开发带来了"大"方便. 用法一:常量 在JDK1.5 之前,我们定义常量都是:  ...

  6. JDK安装配置

    http://www.runoob.com/java/java-environment-setup.html

  7. Linux从零单排(二):setuptools、pip、anaconda2的环境配置

    为了更方便的使用Python的类库,需要进行相应的配置 (一)setuptools的配置 1.setuptools的下载 命令行输入wget https://pypi.python.org/packa ...

  8. bash shell + python简单教程,让你的mac/linux终端灰起来~

    前提条件:已经安装python,命令行支持bash 在bash_profile中添加 function ccolor { python /Users/xirtam/Documents/tools/cc ...

  9. couldn't find setter for xxxxx

    springmvc hibernate框架,在执行普通的插入操作时报错,仔细检查实体类文件,确认该属性的getter setter方法都是有的,哭哭(´;︵;`)jpa策略生成的当然有.可是老是报这个 ...

  10. Spring与ActiveMQ整合

    Spring提供了对JMS的支持,需要添加Spring支持jms的包,如下: <dependency> <groupId>org.springframework</gro ...