(圖片來源: http://ugc.qpic.cn/baikepic2/29906/cut-20141207123211-1562225095.jpg/0)
過濾器(Filter), 為Web容器提供來讓Request到達Servlet前,或是Servlet回傳Response給瀏覽器前的中間夾層
使用者可以藉由放置各個不同的Filter來達到使用者驗證、輸入字元替換或是編碼設定等功能需求
底下用Filter來示範一個字元替換的過濾器,目的是為了在Request進入到Servlet前,
可以讓程式先過濾掉不被允許的字元 ex: HTML標籤(因有廣告或是惡意資安攻擊之可能)
首先我們先寫一個Wrapper(包裹器),用來將request中的內容轉換成可被允許的內容
package bookprac.servlet.filterdemo;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.lang.StringEscapeUtils;
/**
*
* @author allen0818
*/
public class EscapeWrapper extends HttpServletRequestWrapper {
public EscapeWrapper(HttpServletRequest request) {
super(request);
}
public String getParameter(String name) {
String value = getRequest().getParameter(name);
return StringEscapeUtils.escapeHtml(value);
}
}
可以看到,此程式繼承了HttpServletWrapper類別(->一個已實作了HttpServletRequest介面的類別)
我們可以藉由改寫原HttpRequestServlet的getParameter方法內容,來吐回轉換過的可被允許內容
接下來我們來設定攔截器,此攔截器會將原Request的內容透過剛剛我們寫好的Wrapper轉換過後
再將轉換過內容的Request傳送給Servlet執行
程式碼如下:
package bookprac.servlet.filterdemo;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
/**
*
* @author allen0818
*/
@WebFilter("/*")
public class EscapeFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest requestWrapper =
new EscapeWrapper((HttpServletRequest) request);
chain.doFilter(requestWrapper, response);
}
@Override
public void destroy() {}
}
需要注意的地方是:
1. 要在類別前標註 @WebFilter 來讓Web容器認得並註冊到應用程式中
2. /*表示所有的URL Request都會經過這個篩選器,另外也可以設定servletnames屬性來過濾特定的Servlet請求
3. 為Filter的類別需實作Filter類別
我們可以看到: 在doFilter方法中,我們先將原先的Request包裝成新的Request後
再將其透過chain.doFilter方法傳送出去
HttpServletRequest requestWrapper =
new EscapeWrapper((HttpServletRequest) request);
chain.doFilter(requestWrapper, response);
(若沒有其他過濾器,此方法就會將Request傳送給該執行的Servlet)
進而達到輸入字元過濾的需求
參考資料:
1. 「Servlet&JSP教學手冊 第二版」
