Filter,過濾器,用於在servlet以外對request 和response 進行修改。Filter 有一個 FilterChain 的概念,一個FilterChain 包括多個 Filter。客戶端請求 request在抵達servlet 以前,會通過 FilterChain 裏面全部的 Filter,服務器響應 response 從servlet抵達客戶端瀏覽器以前也會通過 FilterChain 裏面全部的 Filter 。java
過濾器是處於客戶端與服務器資源文件之間的一道過濾網,在訪問資源文件以前,經過一系列的過濾器對請求進行修改、判斷等,把不符合規則的請求在中途攔截或修改。也能夠對響應進行過濾,攔截或修改響應。
如下是一張經典的過濾器鏈示意圖:瀏覽器
Filter通常用於:登陸權限驗證、資源訪問權限控制、敏感詞彙過濾、字符編碼轉換、壓縮響應信息等操做,便於代碼重用,沒必要每一個servlet中還要進行相應的操做。服務器
自定義一個Filter須要實現如下操做:編碼
a.建立一個類實現javax.servlet.Filter接口;url
b.實現doFilter()方法;code
c.配置blog
如下是一個簡單的filter demo接口
@WebFilter(urlPatterns = "/myServlet2", initParams = {@WebInitParam(name = "username", value = "MyFilter")}) public class MyFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { System.out.println("---------doFilter-----------"); System.out.println(req.getServletContext().getInitParameter("username")); resp.getWriter().println("---------doFilter-----------"); chain.doFilter(req, resp); System.out.println("---------doFilter------over-----"); } //filter初始化方法,經過FilterConfig能夠獲取到filter配置的初始化參數 public void init(FilterConfig config) throws ServletException { Enumeration<String> parameters = config.getInitParameterNames(); while (parameters.hasMoreElements()) { String element = parameters.nextElement(); System.out.println(element + " = " + config.getInitParameter(element)); } } }
能夠看到,filter是在容器啓動的時候就初始化的。utf-8
@WebFilter(filterName = "PrivateFilter",urlPatterns = "/*") public class PrivateFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("gbk"); chain.doFilter(req, resp); } public void init(FilterConfig config) throws ServletException { } }
@WebFilter(filterName = "PrivateFilter",urlPatterns = "/*") public class PrivateFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { String username = (String) req.getParameter("username"); if (!"張三".equals(username)) { resp.getWriter().println("--------權限不足,沒法訪問---------"); return; } chain.doFilter(req, resp); } public void init(FilterConfig config) throws ServletException { } }