一,實現過濾器
java
在Servlet中,若是要定義一個過濾器,則直接讓一個類實現javax.servlet.Filter接口便可完成。此接口定義了三個方法。
web
NOapp |
方法 | 描述 |
1 | public void init(FilterConfig filterConfig) throws ServletException | 過濾器初始化時調用,能夠經過filterConfig取得配置的初始化參數 |
2 | public void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain) throws ServletException,IOException | 完成具體的過濾操做,而後經過FilterChain讓請求繼續向下傳遞 |
3 | public void destroy() | 過濾器銷燬時使用 |
在三個方法中,最重要的是doFilter()方法,此方法定義了ServletRequest,ServletResponse和FilterChain三種參數,其中前兩個參數表示,過濾器能夠完成對任意協議的過濾操做。FilterChain接口的做用是將用戶的請求向下傳遞給其餘過濾器或Servlet執行操做。
this
FilterChain接口定義的方法
編碼
NO | 方法 | 描述 |
1 | public void doFilter(ServletRequest req,ServletResponse resp) throws IOException,ServletException` | 將用戶請求向下傳遞給其餘過濾器或Servlet |
在FilterChain接口中,定義了一個一樣的doFileter()方法,由於在這一過濾器以後有可能還有其餘過濾器,也多是請求的最終目標Servlet。這樣就經過FilterChain造成了一個「過濾鏈"。
url
public class FilterDemo implements Filter { public void init(FilterConfig config) throws ServletException { String initParam = config.getInitParameter("ref") ; System.out.println("過濾器初始化,初始化參數:"+initParam) ; } public void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain) throws ServletException,IOException{ System.out.println("執行doFilter()方法以前") ; chain.doFilter(req,resp) ; System.out.println("執行doFilter()方法以後") ; } public void destroy() { System.out.println("過濾器銷燬") ; } }
web-xml文件配置
spa
<filter> <filter-name>FilterDemo</filter-name> <filter-class>org.panda.filterdemo.FilterDemo</filter-class> <init-param> <param-name>ref</param-name> <param-value>Hello World</param-value> </init-param> </filter> <filter-mapping> <filter-name>FilterDemo</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
過濾器的初始化方法是在容器啓動時就加載的,而且經過FilterConfig的getInitParamter()方法取得了初始化參數。
code
二,過濾器的應用
xml
1,編碼過濾
接口
爲全部的頁面設置統一的請求編碼
public class EncodingFilter implements Filter { private String charSet ; //設置字符編碼 public void destroy() { System.out.println("過濾器銷燬") ; } public void init(FilterConfig config) throws ServletException { this.charSet = config.getInitParameter("charset") ; //取得初始化參數 } public void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain) throws ServletException,IOException{ resp.setCharacterEncoding("this.charSet") ; //設置統一編碼 } }