2016-05-13 35 views
1

我有一個由Java Spring開發的RESTful服務。我創建了一些過濾器進行身份驗證,獲取一些自定義標題等等。我需要在其中一個過濾器中記錄傳入的請求和傳出響應。現在我堅持記錄響應。這裏是過濾器獲取用於日誌記錄的ServletResponse內容字符串

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException 

servletResponse是我需要獲取內容的對象。

我知道有一些重複的問題已經回答,但由於某些原因,這些都不適合我。

我有一個filterdoFilter方法後chain.doFilter我想記錄響應內容。

當我在檢查responseoutputStreamwriter時,可以看到JSON對象。但我無法通過編程獲得它。

有人可以幫我解決這個問題嗎?先謝謝你!

這裏是我使用並沒有幫助的鏈接:

How to read and copy the HTTP servlet response output stream content for logging

Capture and log the response body

Logging response body (HTML) from HttpServletResponse using Spring MVC HandlerInterceptorAdapter

+0

你嘗試的東西了嗎?你有一些代碼嗎? – ib11

+0

我將編輯我的問題,並將包括我嘗試過並且沒有幫助的所有代碼 – Armen

+0

第一個鏈接到底有什麼用處? – BalusC

回答

1

對於這裏定製的解決方案的想法。

在過濾器中,您需要封裝響應並攔截servlet的輸出,以便您可以編寫它。

public void doFilter(ServletRequest request, 
        ServletResponse response, 
        FilterChain chain) throws ServletException, IOException { 

    // Wrap the response 
    MyResponseWrapper responseWrapper = 
         new MyResponseWrapper((HttpServletResponse) response); 

    chain.doFilter(request, responseWrapper); 
} 

凡MyResponseWrapper是一類,你可以攔截到輸出流的所有呼叫

public class MyResponseWrapper implements HttpServletResponse { 
    private HttpServletResponse response; 
    private ServletOutputStream outputStream; 
    private MyOutputStreamCopier myOutputStreamCopier; 

    public MyResponseWrapper(HttpServletResponse response) { 
     this.response = response; 
    } 

    // Implements all needed methods 

    // Write methods like the following to redirect output to your logs 
    public ServletOutputStream getOutputStream() throws IOException { 
     if (outputStream == null) { 
      outputStream = getResponse().getOutputStream(); 
      copier = new MyOutputStreamCopier(outputStream); 
     } 

     return copier; 
    } 
} 

哪裏MyOutputStreamCopier是延伸ServletOutputStream和複製所有寫入本地緩存(或直接登錄它的自定義類到一個日誌文件)。


如果你喜歡一個已經建立的解決方案來看看這個link

+0

洛倫佐如何獲得doFilter後的內容? – Armen

+0

@Armen基本上MyOutputStreamCopier需要緩衝發送到輸出的數據,所以你可以在第二時間使用它們。可能你可以添加一個方法String getOutputContent()來以String的形式檢索內容。否則,您可以直接寫入類MyOutputStreamCopier中的日誌文件。 –