文章目錄
- 過濾器Filter
- Filter概述
- Filter過濾器生命周期
- Filter執行流程
- Filter過濾器鏈 - 多個過濾器的執行流程(一路執行,再原路回傳)
- Filter過濾器url-pattern路徑匹配方式
- Filter過濾器dispatcher屬性【**】
- Filter案例 - 解決亂碼問題 (一般Filter也是用于這個)
- 監聽器Listener
- 監聽器Listener概述
- 監聽器型別
過濾器Filter
Filter概述
??Filter(過濾器)是Java Web開發的三大組件之一(Servlet Filter Listener)
??一般用于對web資源進行攔截,做一些處理后再交給下一個過濾器或servlet處理
??最常用與解決亂碼問題(配置全域攔截器,攔截所有請求,給request和response都設定編碼,然后放行)
Filter過濾器生命周期
- init方法:服務器啟動時就創建該Filter物件,執行init()方法
- doFilter方法:每當一個請求的路徑是滿足過濾器的配置路徑,那么就會執行一次過濾器的doFilter()方法
- destory方法:服務器關閉的時候銷毀Filter,執行destory()方法
Filter執行流程

- 瀏覽器發送請求,tomcat服務器將http請求轉成request物件,http回應轉response物件
- 通過訪問url的地址查找,找到對應的Filter過濾器將request,resposne傳給它的doFilter()方法
- 處理之后呼叫chain.doFilter(request,response)方法(放行,如果沒有放行,則直接回應給瀏覽器,不繼續往下執行)
- chain.doFilter()放行之后,找到對應的html、jsp、servlet,然后進行處理
- 處理完成之后將response回傳給Filter,然后Filter執行后面的代碼(doFilter()方法里面的)
- 執行完剩余代碼之后,將reponse回應給 瀏覽器
doFilter()方法的內部執行順序:
- 先執行doChain之前的代碼,再執行doChain方法放行
- 再執行Servlet的doGet/doPost或者jsp、html代碼
- 最后執行doChain之后的代碼
Filter過濾器鏈 - 多個過濾器的執行流程(一路執行,再原路回傳)
??多個 Filter 過濾器都對同一個 URL 進行攔截,這些 Filter 就會組成一個Filter 鏈,Filter 鏈用 FilterChain 物件表示,
??會依次呼叫過濾器處理,當過濾器有chain.doFilter(request,response)放行才會繼續往后面的過濾器執行,否則回傳回應,

執行順序是:
瀏覽器 --> doFilter_1(chain.doFilter()方法) --> doFilter_2(chain.doFilter()方法) --> … --> doFilter_n(chain.doFilter()方法) --> 找到資源(Servlet,jsp,html等 ) --> doFilter_n剩余部分 --> … --> doFilter_2剩余部分 --> doFilter_1剩余部分 --> 最后回應給瀏覽器
Filter過濾器url-pattern路徑匹配方式
1:完全路徑匹配(名稱完全相同才行)
@WebFilter("/user")
@WebFilter("/user/hello")
2:目錄匹配(滿足目錄下的所有檔案都匹配)
@WebFilter("/*")
@WebFilter("/user/*")
3:擴展名匹配(后綴擴展名相同就匹配)
@WebFilter("*.html")
@WebFilter("*.jsp")
Filter過濾器dispatcher屬性【**】
- REQUEST:默認值,代表直接通過url地址訪問某個資源時執行對應的Filter(重定向)
- FORWARD:通過請求轉發的時候執行對應的Filter
【dispatcher屬性為默認值REQUEST的時候,就算url匹配,對應的Filter也是不會攔截 請求轉發到這個url的方式】
@WebFilter(value = "/index.jsp",dispatcherTypes={DispatcherType.REQUEST,DispatcherType.FORWARD})
Filter案例 - 解決亂碼問題 (一般Filter也是用于這個)
// 攔截所有請求,對所有請求的request、response做編碼設定
@WebFilter("/*")
public class CharSetFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//1、設定request、response編碼
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
//2. 放行request和response
chain.doFilter(req, resp);
}
}
監聽器Listener
監聽器Listener概述
- 監聽器Listener是用來監聽域物件(域物件ServletContext,HttpSession和ServletRequest【也就是監聽的資料源】)
- 監聽哪個域就實作對應的介面就行
監聽器型別
- 監聽域物件自身的創建和銷毀的事件監聽器,
- 監聽域物件中的屬性的增加和洗掉的事件監聽器,
- 監聽系結到HttpSession域中的某個物件的狀態的事件監聽器,
特點:
- 不需要監聽地址(不需要寫路徑,只需要注解 @WebListener() 表示這是一個監聽器就行)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/78757.html
標籤:其他
