目錄
一、Filter 過濾器
1、概述
當訪問服務器資源時,Filter 過濾器可以將請求攔截下來,完成一些特殊的處理,其作用一般用於完成一些通用的操作,比如:登錄驗證、統一編碼處理、敏感字符過濾等
2、開發步驟
- 定義一個類,實現 Filter 接口
- 重寫方法
- 配置攔截路徑
- web.xml配置
- 註解配置
3、過濾器執行流程
- 請求先經過過濾器
- 經過過濾器過濾後再請求資源
- 請求完資源後再回到過濾器
注:兩個經過過濾器會對request對象請求數據進行增強,對response對象響應數據進行增強(即過濾數據)
4、過濾器生命週期
- init()方法:在服務器啓動後創建Filter對象,調用init方法,只執行一次,用於加載資源
- doFilter()方法:每一次請求被攔截請求資源時調用,可執行多次
- destory()方法:服務器正常關閉時調用distory方法銷燬Filter對象,只執行一次,用於釋放資源
@WebFilter("/*") //訪問所有資源之前都會執行該過濾器
public class myFilter implements Filter {
/*
在服務器啓動後創建Filter對象,調用init方法,只執行一次,用於加載資源
*/
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化");
}
/*
每一次請求被攔截請求資源時調用,可執行多次
*/
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("oneStar");
//放行
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("BackoneStar");
}
/*
服務器正常關閉時調用distory方法銷燬Filter對象,只執行一次,用於釋放資源
*/
public void destroy() {
System.out.println("銷燬");
}
}
5、過濾器配置問題
【1】攔截路徑配置
- 具體資源路徑:/index.jsp ==> 只有訪問index.jsp資源時,過濾器纔會被執行
- 攔截目錄:/user/* ==> 訪問/user下的所有資源時,過濾器都會被執行
- 後綴名攔截:*.jsp ==> 訪問所有後綴名問jsp資源時,過濾器都會被執行
- 攔截所有資源:/* ==> 訪問任何資源,過濾器都會被執行
【2】攔截方式的配置
- 註解配置(設置配置文件的 dispatcherTypes 屬性)
- REQUEST:默認值,瀏覽器直接請求資源
- FORWARD:轉發訪問資源
- INCLUDE:包含訪問資源
- ERROR:錯誤跳轉資源
- ASYNC:異步訪問資源
- web.xml配置
- 配置<dispatcher></dispatcher>標籤即可
//瀏覽器直接請求index.jsp資源時,該過濾器會被執行
//@WebFilter(value = "/index.jsp",dispatcherTypes = DispatcherType.REQUEST)
//只有轉發index.jsp資源時,該過濾器纔會被執行
//@WebFilter(value = "/index.jsp",dispatcherTypes = DispatcherType.FORWARD)
//瀏覽器直接請求index.jsp資源,轉發index.jsp資源時,該過濾器會被執行
@WebFilter(value = "/index.jsp",dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
public class myFilter implements Filter {
6、過濾器鏈(配置多個過濾器)
【1】執行順序
- 過濾器1
- 過濾器2
- 資源執行
- 過濾器2
- 過濾器1
【2】過濾器先後順序
- 註解配置:按照類名的字符串比較規則進行比較,值小的先執行
eg:AFilter 和 BFilter,AFilter 先執行 - web.xml:<filter-mapping>中誰定義在上面就先執行誰
二、Listener 監聽器
監聽器是一個專門用於對其他對象身上發生的事件或狀態改變進行監聽和相應處理的對象,當被監視的對象發生情況時,立即採取相應的行動。監聽器其實就是一個實現特定接口的普通java程序,這個程序專門用於監聽另一個java對象的方法調用或屬性改變,當被監聽對象發生上述事件後,監聽器某個方法立即被執行。比如監聽在線用戶的數量。
1、ServletContextListener 接口
ServletContextListener接口主要是監聽ServletContext 對象的創建和銷燬,用到的方法有:
- void contextDestoryed(ServletContextEvent sce):ServletContext對象銷燬之前會調用該方法
- void contextInitialized(ServletContextEvent sce):ServletContext 對象創建後會調用該方法
2、開發步驟
- 定義一個類,實現 ServletContextListener 接口
- 重寫方法
- 配置
- web.xml 配置
- 註解配置
@WebListener
public class myListener implements ServletContextListener {
/*
監聽ServletContext對象,服務器啓動後自動創建ServletContext對象
*/
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
//獲取ServletContext對象
ServletContext servletContext = servletContextEvent.getServletContext();
//加載文件資源
String intiparameter = servletContext.getInitParameter(s);
//獲取真實路徑
String realPath = servletContext.getRealPath(intiparameter);
//加載進內存
try {
FileInputStream FS = new FileInputStream(realPath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
/*
服務器正常關閉後調用該方法,關閉後ServletContext對象被銷燬
*/
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
}