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主要有瀏覽器
5. Filter在web.xml中的其餘幾個配置標籤的用處:緩存
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