J2EE過濾器Filter基礎

當頁面發送請求時,符合filter過濾範圍的請求會首先進入過濾器,過濾器就可以執行一些過濾操作:比如編碼格式,session驗證,日誌記錄等。而這些功能都是自己編寫過濾器實現的。
要實現一個過濾器,需要繼承Filter接口,實現init、doFilter和destroy方法,這三個方法分別在過濾器初始化、過濾器運行和過濾器銷燬時執行。
下面這段代碼,是一個字符集過濾器,每次請求都會設置字符集編碼格式,注意每次請求都會運行doFilter方法,過濾之後你需要在方法內調用FilterChain.doFilter這樣就能讓請求訪問指定的servlet。
假設你不希望請求訪問下一個servlet,你可以選擇重定向,跳轉到指定頁面。
/**
 * 
 * @author     : bless<[email protected]>
 * Create Time : 2011-5-10下午10:38:19
 * Description : 字符集格式過濾器
 *
 */
public class EncodingFilter implements Filter {
	//默認編碼格式UTF-8
	private static final String DEFAULT_ENCODE = "UTF-8";
	
	private String encodeName; // 編碼格式

	public void destroy() {

	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		try {
			if (encodeName == null || "".equals(encodeName.trim())) {
				request.setCharacterEncoding(DEFAULT_ENCODE);
				response.setCharacterEncoding(DEFAULT_ENCODE);
			} else {
				request.setCharacterEncoding(encodeName);
			}
		} catch (UnsupportedEncodingException e) {
			throw new UnsupportedEncodingException("編碼格式過濾錯誤,請確認web.xml填入了正確的編碼格式");
		}
		chain.doFilter(request, response);
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		//獲取web.xml配置的<param-name>encodeName</param-name>的值
		this.setEncodeName(fConfig.getInitParameter("encodeName")); 
	}

	public String getEncodeName() {
		return encodeName;
	}

	public void setEncodeName(String encodeName) {
		this.encodeName = encodeName;
	}

}

然後在web.xml中定義filter即可,標籤init-param可以做一個參數配置,在filter中通過init方法參數FilterConfig.getInitParameter獲得
<filter>
    <filter-name>encoding</filter-name>
    <filter-class>com.mt.filter.EncodingFilter</filter-class>
    <init-param>
    	<param-name>encodeName</param-name>
    	<param-value>GBK</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章