2013-08-05 33 views
0

我嘗試使用aspectJ攔截HttpServlet.do *(request,response)並獲取HTML文本(需要提取標題並將html存儲到文件中)。Aspectj:獲取來自HttpServletRresponse的響應正文(HTML文本)

一旦我有了對HttpServletResponse的引用,訪問響應正文(html文本)的最佳方式是什麼?

這是我的凝視代碼。

public aspect HttpRequestHandlerAspect { 

pointcut getRequest(HttpServletRequest request, HttpServletResponse response) 
    : execution(protected * javax.servlet.http.HttpServlet.*(HttpServletRequest, HttpServletResponse)) 
    && args(request, response); 

    Object around(HttpServletRequest request, HttpServletResponse response) : getRequest(request, response) { 
     Object ret = proceed(request, response); 
       // now how do I access the HTML response text (and get the title of the page) in here? 

    } 
} 
+0

爲什麼你不使用過濾器。你不能直接從'OutputStream'中讀取。 –

回答

1

這可能不是你的問題的確切的答案,但嘗試提取響應,這裏建議:How can I read an HttpServletReponses output stream? 您不必創建一個過濾器,只有一個HttpServletResponseWrapper它傳遞給

繼續(請求,包裝)。

Object around(HttpServletRequest request, HttpServletResponse response): getRequest(request, response) { 
    MyHttpServletResponseWrapper wrapper = new MyHttpServletResponseWrapper(response); 
    Object ret = proceed(request, wrapper); 
    // The MyHttpServletReponseWrapper class captures everything and doesn't forward to the original stream, so we have to do this 
    response.getWriter().write(wrapper.toString()); 
    // use wrapper.toString() to access response 
} 
+0

感謝您的回答,雖然這工作正常,以獲得HTML文本,它不會呈現給瀏覽器的響應了。我希望得到響應的HTML,而用戶不會感覺到差異。 – Sammy

+0

@Sammy:事實上,包裝類返回自己的'PrintWriter',它不會將寫入轉發給包裝響應的'PrintWriter'。我修改了我的答案,它提供了一個解決方法,在調用「proceed(request,wrapper)」之後寫入整個捕獲的數據。最好創建一個像[this]一樣的'TeePrintWriter'(http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/output/TeeOutputStream.html)。 – Katona

+0

@Sammy:你可以找到一個'CopyPrintWriter',它實際上是寫入捕獲,但也代表原始的:http://stackoverflow.com/a/3242482/594406 – Katona