(圖片來源: 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教學手冊 第二版」
留言列表