JavaWeb過濾器——Filter

1. Filter的簡單使用

    1. Filter也稱爲過濾器,是用來攔截過濾來自客戶端的請求,以及服務端返回的響應資源,如Jsp、Servlet,js等,憑藉過濾器能夠實現某些功能。過濾器不是請求的目標資源,而是在請求被服務器處理前,以及返回響應時執行的,也就是說過濾器的攔截是雙向的,而且能夠有多個。html

    2. Filter的編寫:實現Filter接口,便可編寫一個過濾器類,而後將實現的Filter類在web.xml中進行配置便可。java

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;

public class FilterTest1 implements Filter {
	/**
	 * @see Filter的銷燬方法
	 */
	public void destroy() {
		
	}
	/**
	 * @see Filter的攔截處理代碼
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("攔截請求");
		chain.doFilter(request, response);//必須有這行代碼
		System.out.println("攔截響應");
	}
	/**
	 * @see Filter初始化方法
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		
	}
}
<!-- web.xml中配置過濾器 -->
  <filter>
  	<filter-name>FilterTest1</filter-name>
  	<filter-class>servlet.filter.FilterTest1</filter-class>
<!-- 配置Filter初始化參數
  	<init-param>
  		<param-name></param-name>
  		<param-value></param-value>
  	</init-param>
  	-->
  </filter>
  <filter-mapping>
  	<filter-name>FilterTest1</filter-name>
  	<url-pattern>/*</url-pattern>
  	<!-- 路徑配置與Servlet中的配置方法相同-->
<!-- 其它配置
  	<dispatcher></dispatcher>指定過濾器所攔截的資源被服務器調用的方式,有4個參數,分別是
  	REQUEST,INCLUDE,FORWARD和ERROR四種,默認爲REQUEST。REQUEST表示攔截全部的請求,
  	FORWARD表示只攔截全部的轉發的請求,
  	ERROR表示只攔截錯誤響應,須要<error-page>標籤對錯誤進行配置
  	<servlet-name></servlet-name>過濾器過濾訪問指定Servlet的請求
  	 -->
  </filter-mapping>

    3. FilterChain:即Filter鏈,因爲Filter能夠有多個,全部它們組合起來就是Filter鏈,服務器依據Filter在web.xml中<filter-mapping>的配置順序來依次調用,服務器會建立一個FilterChain對象來表示Filter鏈,在調用FilterChain對象的doFilter方法時,就會依照FilterChain對象中保存的Filter鏈依次執行下去。web

    4. FilterConfig接口:獲取Filter配置參數,其API主要有瀏覽器

  • public String getFilterName():獲取Filter名,即<filter-name>FilterTest1</filter-name>
  • public ServletContext getServletContext():獲取Filter所在的web項目名
  • public String getInitParameter(String name):依據參數名,獲取配置Filter中的一些初始化參數值
  • public Enumeration<String> getInitParameterNames():獲取Filter配置中全部參數的名稱

    5. Filter在web.xml中的其餘幾個配置標籤的用處:緩存

2. Filter的應用

    1. 設置全局編碼:在服務端,每一個請求對應的每一個Servlet都須要設置其編碼格式放置出現亂碼,因此爲了減小代碼量,使用Filter就能夠一次性實現設置全局編碼格式。安全

public class FilterTest2 implements Filter{

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		//設置post請求編碼
		request.setCharacterEncoding("utf-8");
		//設置響應編碼格式
		response.setContentType("text/html;charset=utf-8");
		//放行
		chain.doFilter(request, response);
	}

	@Override
	public void destroy() {}
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {}
}

再將該Filter配置到web.xml中便可。服務器

    2. 禁用瀏覽器緩存:session

public class FilterTest3 implements Filter {
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {}
	
    //設置禁用瀏覽器緩存
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		chain.doFilter(request, response);
        HttpServletResponse res=(HttpServletResponse) response;
		res.setHeader("Cache-Control", "no-cache");
		res.setHeader("Pragma", "no-cache");
		res.setDateHeader("Expires", -1);
	}
	
	@Override
	public void destroy() {}
}

    3. 依據ip統計網站訪問次數:app

public class FilterTest4 implements Filter {
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		//ip綁定訪問次數,數據必須放在域對象中,推薦ServletContext和session對象中
		HttpServletRequest req=(HttpServletRequest) request;
		String ip=req.getRemoteAddr();
		HttpSession s=req.getSession();
		if(s.isNew()){
			s.setAttribute(ip, 1);
		}else{
			s.setAttribute(ip, (Integer)s.getAttribute(ip)+1);
		}
		chain.doFilter(request, response);
		
	}

	@Override
	public void destroy() {}

}

    4. URL級別(粗粒度)的權限驗證:利用攔截器的特性,能夠經過URL來判斷是否容許請求獲取對應響應資源,這是一種簡單的網站安全措施。先定義正確的或者說攔截器容許經過的路徑有哪些(能夠在web.xml中配置Filter初始化參數<init-param>來直接定義),而後在攔截器中,獲取請求的路徑,而後進行處理對比,判斷是否匹配,匹配就繼續放行,不然攔截。ide

相關文章
相關標籤/搜索