2013-10-01 84 views
1

我的過濾器應該編輯響應的HTML。但是,當我瀏覽到一個頁面什麼都不做,因爲Servlet過濾器堅持沒有響應文本

newResponse.toString(); 

回報null

進一步調試表明,該toString方法中,writernull

這裏,這似乎是這個問題的部分:

public ServletOutputStream getOutputStream() throws IOException { 
    if (getWriterCalled) { 
     throw new IllegalStateException("getWriter already called"); 
    } 

    getOutputStreamCalled = true; 
    return super.getOutputStream(); 
    } 

    public PrintWriter getWriter() throws IOException { 
    if (writer != null) { 
     return writer; 
    } 
    if (getOutputStreamCalled) { 
     throw new IllegalStateException("getOutputStream already called"); 
    } 
    getWriterCalled = true; 
    writer = new PrintWriter(charWriter); 
    return writer; 
    } 

    public String toString() { 
    String s = null; 

    if (writer != null) { 
     s = charWriter.toString(); 
    } 
    return s; 
    } 
} 

完整的代碼是在這裏:

Filter that uses a response wrapper to convert all output to uppercase

+1

你已經封裝了'Writer'而不是'OutputStream'。你的servlet可能直接寫入'OutputStream'。使用調試器。 –

回答

1

據我所知,servlet過濾器鏈在HTTP上被調用請求之前它到達目標(例如 - servlet)。當您使用Filter來獲取由請求目標點生成的內容時,您將獲得null,因爲它僅在將來存在。 但有一個適當的解決方案,在文檔(http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/Filter.html)中提到。 只是讓你的響應包裝裝飾了對HttpServletResponse內容的訪問。例如 - 用你的自定義覆蓋默認的作家,它會檢測他的write()方法中的字母和大寫字母。

+0

我看了一下那個鏈接,但是我沒有看到你提到的解決方案。 – ColBeseder

+0

在doFilter()描述中有句子「3.可選地用自定義實現包裝響應對象以過濾輸出過濾的內容或標題」。我只是試圖發展這個想法。真的想想輸入或輸出流覆蓋/鏈接。 –

+0

謝謝。事實證明,我的問題比這更容易。但是這個鏈接無論如何都是有用的。 – ColBeseder

0

我試圖過濾的頁面是index.html

看起來,過濾器只能編輯以.jsp結尾的頁面的響應。

+0

這只是修復過濾器映射中的URL模式的問題。 – BalusC

+0

@BalusC當前url-pattern被設置爲'/ *'。爲什麼只接受'.jsp'文件? – ColBeseder