Filter:過濾器 & Listener:監聽器
Filter:過濾器
1. 概念:
web中的過濾器:當訪問服務器的資源時,過濾器可以將請求攔截下來,完成一些特殊的功能。
過濾器的作用:
一般用於完成通用的操作。如:登錄驗證、統一編碼處理、敏感字符過濾…
2. 快速入門:
代碼:
@WebFilter("/*")//訪問所有資源之前,都會執行該過濾器
public class FilterDemo1 implements Filter {//實現接口Filter
//複寫方法
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filterDemo1被執行了....");
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
3. 過濾器細節:
web.xml配置
<filter>
<filter-name>demo1</filter-name>
<filter-class>cn.itcast.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<!-- 攔截路徑 -->
<url-pattern>/* </url-pattern>
</filter-mapping>
過濾器執行流程
1. 執行過濾器
2. 執行放行後的資源
3. 回來執行過濾器放行代碼下邊的代碼
過濾器生命週期方法
1. init:在服務器啓動後,會創建Filter對象,然後調用init方法。只執行一次。用於加載資源
2. doFilter:每一次請求被攔截資源時,會執行。執行多次
3. destroy:在服務器關閉後,Filter對象被銷燬。如果服務器是正常關閉,則會執行destroy方法。只執行一次。用於釋放資源
過濾器配置詳解 攔截路徑配置:
1. 具體資源路徑: /index.jsp 只有訪問index.jsp資源時,過濾器纔會被執行
2. 攔截目錄: /user/* 訪問/user下的所有資源時,過濾器都會被執行
3. 後綴名攔截: *.jsp 訪問所有後綴名爲jsp資源時,過濾器都會被執行
4. 攔截所有資源:/* 訪問所有資源時,過濾器都會被執行
攔截方式配置:資源被訪問的方式
註解配置:設置dispatcherTypes屬性
1. REQUEST:默認值。瀏覽器直接請求資源
2. FORWARD:轉發訪問資源
3. INCLUDE:包含訪問資源
4. ERROR:錯誤跳轉資源
5. ASYNC:異步訪問資源
web.xml配置
設置<dispatcher>REQUEST</dispatcher>
標籤即可
過濾器鏈(配置多個過濾器)
執行順序:如果有兩個過濾器:過濾器1和過濾器2
1. 過濾器1
2. 過濾器2
3. 資源執行
4. 過濾器2
5. 過濾器1
過濾器先後順序問題:
1. 註解配置:按照類名的字符串比較規則比較,值小的先執行
如: AFilter 和 BFilter,AFilter就先執行了。
2. web.xml配置: <filter-mapping>誰定義在上邊,誰先執行
Listener:監聽器
1.概念:web的三大組件之一。
事件監聽機制
事件 :一件事情
事件源 :事件發生的地方
監聽器 :一個對象
註冊監聽:將事件、事件源、監聽器綁定在一起。 當事件源上發生某個事件後,執行監聽器代碼
ServletContextListener
:監聽ServletContext
對象的創建和銷燬
2.方法
void contextDestroyed(ServletContextEvent sce)
:ServletContext對象被銷燬之前會調用該方法
void contextInitialized(ServletContextEvent sce)
:ServletContext對象創建後會調
*
配置web.xml
<listener>
<listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class>
</listener>
指定初始化參數
2. 註解:
@WebListener
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/*
* 創建監聽器的步驟:
* 1.創建一個普通的java類,實現監聽器接口
* 我們監聽什麼,就實現相應的接口
* 比如我們現在要監聽上下文對象的創建與銷燬,那麼我們就要實現ServletContextListener這個接口
* 2.重寫監聽方法
* 我們在這裏重寫的是監聽session對象創建與銷燬的方法.
*/
public class Listener implements HttpSessionListener {
//監聽session對象的創建,如果session對象創建了,則馬上執行該方法,對我們進行通知
@Override
public void sessionCreated(HttpSessionEvent event) {
System.out.println("session對象創建了");
}
//監聽session對象的銷燬,如果session對象銷燬了,則馬上執行該方法,對我們進行通知
@Override
public void sessionDestroyed(HttpSessionEvent event) {
System.out.println("session對象銷燬了");
}
}