Tomcat Filter 源码分析
Filter 概述
Servlet API中提供了一個Filter接口,開發web應用時,如果編寫的Java類實現了這個接口,則把這個java類稱之為過濾器Filter。
通過Filter技術,開發人員可以實現用戶在訪問某個目標資源之前,對訪問的請求和響應進行攔截。簡單說,就是可以實現web容器對某資源的訪問前截獲進行相關的處理,還可以在某資源向web容器返回響應前進行截獲進行處理。
Filter工作流程圖如下:
Tomcat中的Filter 是采用責任鏈設計模式 ,下面我們通過源碼分析下tomcat中Filter的實現
StandardWrapperValve.invoke()方法
創建一個過濾器鏈,并把待執行的 servlet 對象存放到過濾器鏈中。
ApplicationFilterFactory.createFilterChain() 方法
1. 把要執行的servlet存放到過濾器鏈中。
2. 如果沒有配置過濾器則return一個空的過濾器鏈(只包含上面設置的servlet)。
3. 如果配置過濾器,則把所有配置的過濾器加入到過濾器鏈中
3.1 首先判斷filter-mapping中配置的dispatcher規則,如果符合則進入下一步
3.2 然后判斷filter-mapping中配置的url-pattern規則,如果符合則添加到過濾器鏈
過濾器的順序是按照web.xml中的先后順序執行的。
StandardWrapperValve.invoke()方法
如果servlet和過濾器鏈都不為空,則開始調用過濾器鏈的doFilter() 方法
ApplicationFilterChain.doFilter()->internalDoFilter()
pos:為過濾器鏈中當前執行的過濾器下標。
n:過濾器鏈中的過濾器個數。
每執行一個過濾器則把過濾器鏈中的post+1(下標),直到所有的過濾器的doFilter方法都調用成功。
filter.doFilter(request, response, this);這行代碼是責任鏈設計模式的核心,把當前的過濾鏈傳入到doFilter方法中。
這樣在Filter中進行攔截,通過過濾器判斷是否要進行調用下一個過濾器鏈。
過濾器鏈中的所有過濾器的doFilter方法都執行完成后,最后再調用過濾器鏈中存放的servlet.service()方法。
本人簡書blog地址:http://www.jianshu.com/u/1f0067e24ff8????
點擊這里快速進入簡書
GIT地址:http://git.oschina.net/brucekankan/
點擊這里快速進入GIT
總結
以上是生活随笔為你收集整理的Tomcat Filter 源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tomcat connector 实现原
- 下一篇: Tomcat WebappClassLo