首先 咱們的目的是作一個攔截器 可以對http請求作profiler,可以記錄本次的調用狀況,這裏說下如何從http請求中獲取到出參的問題。html
方案一:參照http://blog.csdn.net/wuhenzhangxing/article/details/53079458api
該方案中,使用了HttpServletResponseWrapper,也就是HttpServletResponse的裝飾器,至關一是一個代理,當業務中對response作寫入的時候,會被裝飾器攔截下來作個處理,好比輸出到另外的一個ByteArrayOutputSteam中。而後咱們就能夠獲取到指定的值了。tomcat
這種方案,使用的是標準的servlet api,比較標準 可是感受仍是有個小麻煩。app
方案二:既然反射的功能那麼強大 那麼咱們能不能用反射來作呢?測試
上代碼:spa
/*獲取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非兼容.net