1. Filter 簡介
這方面的內(nèi)容以前看的幾本書里都找不到,想到了Sun J2EE的Tutorial,果然里面有比較詳細的解釋。
Filter是一個傳輸請求或者響應的報頭和內(nèi)容的對象,通常的作用是:
a) 根據(jù)不同情況處理請求。
b) 阻止請求-響應的過遠傳送。(Block the request-and-response pair from passing any further.)
c) 通過自定義新的請求版本,修改請求報頭和數(shù)據(jù)。
d) 通過自定義新的響應版本,修改響應報頭和數(shù)據(jù)。
e) 和外部資源交互。
2. Filter 編程
filtering API由javax.servlet包中的Filter, FilterChain和FilterConfig接口定義。
其中最重要的方法是doFilter。它可以用來:
a) 檢查請求報頭。
b) 自定義請求對象。
c) 自定義響應對象。
d) 調(diào)用過濾鏈(filter chain)中的下一個實體(entity)。如果當前過濾器已經(jīng)是鏈中最后一個過濾器了,下一個實體就是鏈尾的資源;否則它就是在WAR中設置的下一個過濾器。當然也可以在此時通過不調(diào)用下一個實體來中斷請求、
e) 在響應報頭調(diào)用下一個過濾器后檢查。
f) 拋出反應處理錯誤的異常。
3. 一個 Duke's Bookstore 的例子
HitCounterFilter在servlet被訪問時計數(shù)。
public final class HitCounterFilter implements Filter {
private FilterConfig filterConfig = null;
public void init(FilterConfig filterConfig)
throws ServletException {
this.filterConfig = filterConfig;
}
public void destroy() {
this.filterConfig = null;
}
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws IOException, ServletException {
if (filterConfig == null)
return;
StringWriter sw = new StringWriter();
PrintWriter writer = new PrintWriter(sw);
Counter counter = (Counter)filterConfig.
getServletContext().
getAttribute("hitCounter");
writer.println();
writer.println("===============");
writer.println("The number of hits is: " +
counter.incCounter());
writer.println("===============");
// Log the resulting string
writer.flush();
System.out.println(sw.getBuffer().toString());
...
chain.doFilter(request, wrapper);
...
}
}
4. 設置過濾器映射
部署描述符文件的2.3版本引入了兩個用于過濾器的元素,分別是:filter和filter-mapping。filter元素向系統(tǒng)注冊一個過濾對象,filter-mapping元素指定該過濾對象所應用的URL。
1.filter元素
filter元素位于部署描述符文件(web.xml)的前部,所有filter-mapping、servlet或servlet-mapping元素之前。filter元素具有如下六個可能的子元素:
icon 這是一個可選的元素,它聲明IDE能夠使用的一個圖象文件。
filter-name 這是一個必需的元素,它給過濾器分配一個選定的名字。
display-name 這是一個可選的元素,它給出IDE使用的短名稱。
description 這也是一個可選的元素,它給出IDE的信息,提供文本文檔。
filter-class 這是一個必需的元素,它指定過濾器實現(xiàn)類的完全限定名。
init-param 這是一個可選的元素,它定義可利用FilterConfig的getInitParameter方法讀取的初始化參數(shù)。單個過濾器元素可包含多個init-param元素。
filter-mapping元素
filter-mapping元素位于web.xml文件中filter元素之后serlvet元素之前。它包含如下三個可能的子元素::
l filter-name 這個必需的元素必須與用filter元素聲明時給予過濾器的名稱相匹配。
l url-pattern 此元素聲明一個以斜杠(/)開始的模式,它指定過濾器應用的URL。所有filter-mapping元素中必須提供url-pattern或servlet-name。但不能對單個filter-mapping元素提供多個url-pattern元素項。如果希望過濾器適用于多個模式,可重復整個filter-mapping元素。
l servlet-name 此元素給出一個名稱,此名稱必須與利用servlet元素給予servlet或JSP頁面的名稱相匹配。不能給單個filter-mapping元素提供多個servlet-name元素項。如果希望過濾器適合于多個servlet名,可重復這個filter-mapping元素。