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