• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
生若秋叶
gonna to be a designer,a designer of my life!!
博客园    首页    新随笔    联系   管理    订阅  订阅

使用filter获取http请求的出参以及入参

首先 我们的目的是做一个拦截器 能够对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非兼容

posted @ 2016-11-29 21:43  HappyCoder  阅读(5221)  评论(1)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3