過濾器Filter的基本概述
Filter:客戶端訪問Web資源時,可以進行請求和響應的攔截,
如果條件成立,纔可以讓客戶端訪問Web資源
如果條件不成立,不可以讓客戶端訪問Web資源
可用於全站字符編碼統一,權限控制,,,
開發Filter簡單步驟
1 創建一個JavaWeb工程
2 創建一個普通Java類,去實現Filter接口
public class MyFilter implements Filter { @Override public void destroy() { } @Override public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException { System.out.println("aaaaa"); //將請求放行,繼續訪問index.jsp chain.doFilter(req,res); System.out.println("bbbbb"); } @Override public void init(FilterConfig arg0) throws ServletException { } } |
3 在web.xml文件中對Filter進行配置
<!-- Filter基本信息 --> <filter> <!-- Filter取一個別名 --> <filter-name>MyFilter</filter-name> <!-- Filter的全名(包名+類名) --> <filter-class>com.aaa.filter.MyFilter</filter-class> </filter>
<!-- Filter過濾信息 --> <filter-mapping> <!-- Filter取一個別名,同上 --> <filter-name>MyFilter</filter-name> <!-- Filter的過濾路徑,如你們訪問我的index.jsp時,Filter就會進行過濾或攔截,配個/*所有請求都過濾 --> <url-pattern>/index.jsp</url-pattern> </filter-mapping> |
Filter的生命週期
Filter:
無參構造器->init(),在web服務器啓動時執行,且只執行一次
doFilter,當Filter需要過濾web.xml文件中配置的路徑時,這時
doFilter會執行,可以執行N次
當Web服務器決定不要Filter了,就將Filter刪除,在刪除前先執行
destroy方法,且一個Filter只執行一次。
無參構造器,init(),destroy(),只執行一次
doFilter()方法可以執行0次或N次
Filter也是一個單例模式的
四種過濾類型
REQUEST:直接訪問to.jsp時,Filter會進行攔截,除此之外,Filter不會進行攔截
這種過濾類型是默認類型,可以在web.xml文件中不用配置
<filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping> |
FORWARD:只有在轉發時,Filter會攔截,除此之外,Filter不會進行攔截
<filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/*</url-pattern> <!-- 過濾類型 --> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping> |
INCLUDE:只有在包含時,Filter會攔截,除此之外,Filter不會進行攔截
<filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/*</url-pattern> <!-- 過濾類型 --> <dispatcher>REQUEST</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping> |
ERROR:如有發生了錯誤信息,且在web.xml文件中聲明瞭,Filter會攔截,
除此之外,Filter不會進行攔截
<filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/*</url-pattern> <!-- 過濾類型 --> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>ERROR</dispatcher> </filter-mapping> |
默認是REQUEST
如果多個Filter同時過濾同一種<url-pattern>的話,我們將這些Filter組成一個集合,
它們都在同一個鏈條上,這個鏈條就叫過濾器鏈。