日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Tomcat Filter 源码分析

發(fā)布時(shí)間:2024/9/30 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Tomcat Filter 源码分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。