0.jpg
(圖片來源: 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教學手冊 第二版」

 

 

arrow
arrow
    文章標籤
    JSP Servlet Filter
    全站熱搜

    allen0818 發表在 痞客邦 留言(0) 人氣()