2014-05-08 32 views
0

我有一個HeaderFilter包含簡單的String我想添加到一個servlet的html。調用後的隱形HeaderFilter chain.doFilter()

當我調用chain.doFilter(req, resp)HeaderFilterdoFilter()方法,提到的文字是不可見的,我認爲它可以以某種方式覆蓋?但是,當我不調用chain.doFilter(req, resp)時,文本是可見的,但其餘不是。

什麼問題?


所以這是我的代碼在HeaderFilter類:

package com.example; 

import javax.servlet.*; 
import javax.servlet.http.*; 

import java.io.*; 
import java.util.*; 

public class HeaderFilter implements Filter { 

private String header = "<table cellpadding='2' cellspacing='2' border='1' width='100%'>" 
     + "<tbody><tr><td valign='Top' bgcolor='#000099'>" 
     + "<div align='Center'><font color='#ffffff'>Header</font></div></td>" 
     + "</tr></tbody></table>"; 

private Properties encodings = new Properties(); 

public void init(FilterConfig fc) throws ServletException { 
} 

public void doFilter(ServletRequest req, ServletResponse resp, 
     FilterChain chain) throws IOException, ServletException { 

    Locale locale = req.getLocale(); 
    String charset = (String) encodings.get(locale); 
    if (charset == null) 
     charset = "windows-1250"; 
    resp.setContentType("text/html; charset=" + charset); 

    PrintWriter out = resp.getWriter(); 
    out.println(header); 

    chain.doFilter(req, resp); 
} 

public void destroy() { 

} 
} 

不知道我是否應該張貼任何其他代碼?

+0

請添加代碼 – UVM

回答

0

如果你讀filter essentials,有寫的是:

修改響應頭和數據。您可以通過提供 自定義版本的響應來完成此操作。

修飾的響應通常必須捕獲​​響應 之前它被返回到客戶端的過濾器。執行此操作的方法是將生成響應的 servlet傳遞給一個替代流。流流阻止servlet在完成時關閉原始響應流 ,並允許過濾器修改servlet的響應 。

所以解釋很簡單:

當你不叫濾鏡鏈中下一個項目,你的代碼將被寫入,並返回給瀏覽器。但是當您將控制權交給下一個過濾器時,它將被替換。

爲了實現你的影響,你需要:

  1. 調用過濾器鏈
  2. 搶最終響應的StringBuilder
  3. 找到HTML表格標籤的位置
  4. 插入HTML代碼
  5. 寫修改後的回覆

查看用於代碼示例的鏈接文檔。