1. 程式人生 > >Filter對Response的改變:HttpServletResponseWrapper的工作原理

Filter對Response的改變:HttpServletResponseWrapper的工作原理

7)Filter對Response的改變:HttpServletResponseWrapper的工作原理

馬 克-to-win:前面我們講的知識,主要說的是由於Filter的參與,使用者的訪問路徑被改變的問題。底下我們就要講一點更難的話題,就是Filter 如何改變一個現有的html。比如我寫的新浪部落格,寫完以後,一上傳,內容有時有些改變,誰動的手腳?肯定是新浪公司編了什麼Filter過濾器,把我的 html的內容給改變了。馬克-to-win:現在問題是:這是如何實現的呢?這裡核心問題其實就是如何改變Response?本來我的html在原來的 Response裡,準備返回給客戶端。但現在在Filter當中被改變了。但這又是怎麼改變的呢?這裡涉及到一個 HttpServletResponseWrapper的類例項myWrapper問題。Wrapper英文就是包裹者的意思。正常情況下,我們過去的認 識是:chain.doFilter(request, response);的意思就是訪問完後面的目標資源以後,目標資源把要返回給客戶端的內容放在Response當中。而現在這裡的例子就不同了:通過 chain.doFilter(request, myWrapper

);目標資源就會把 要返回給客戶端的內容放在myWrapper當中了。這時在Filter當中,我們就可以從myWrapper當中取出返回給客戶端的內容,接著就可以大 大方方的對其進行改變了。要想做成這件事兒,當然還得符合sun公司制定的有關HttpServletResponseWrapper的所有規章制度。首 先通過MarkToWinWrapper myWrapper = new MarkToWinWrapper((HttpServletResponse) response);讓response和myWrapper聯絡起來。馬克-to-win:之後,在我編的MarkToWinWrapper這個普通類 當中,需要初始化一個CharArrayWriter的例項:myContent = new CharArrayWriter();和PrintWriter的例項pw=new PrintWriter(myContent);

詳情請見:http://www.mark-to-win.com/index.html?content=Jsp/jspUrl.html&chapter=Jsp/jsp6_web.html#HttpServletResponseWrapper