使用filter獲取http請求的出參以及入參

首先 咱們的目的是作一個攔截器 可以對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

相關文章
相關標籤/搜索