使用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非兼容


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM