首先 我們的目的是做一個攔截器 能夠對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非兼容