JavaWeb中監(jiān)聽器+過濾器+攔截器區(qū)別幌羞、配置和實(shí)際應(yīng)用

1.前沿

在web.xml中各個元素的執(zhí)行順序是這樣的:context-param-->listener-->filter-->servlet蠢涝; 而攔截器是在Spring MVC中配置的爆存,如果從整個項目中看株扛,一個servlet請求的執(zhí)行過程就變成了這樣context-param-->listener-->filter-->servlet-->interceptor(指的是攔截器)养距,為什么攔截器是在servlet執(zhí)行之后诉探,因為攔截器本身就是在servlet內(nèi)部的,下面把所學(xué)和所總結(jié)的用自己的描述整理出來~棍厌。

2.概念

  • context-param:就是一些需要初始化的配置肾胯,放入context-param中,從而被監(jiān)聽器(這里特指org.springframework.web.context.ContextLoaderListener)監(jiān)聽耘纱,然后加載敬肚;

  • 監(jiān)聽器(listener):就是對項目起到監(jiān)聽的作用,它能感知到包括request(請求域)束析,session(會話域)和applicaiton(應(yīng)用程序)的初始化和屬性的變化帘皿;

  • 過濾器(filter):就是對請求起到過濾的作用,它在監(jiān)聽器之后畸陡,作用在servlet之前鹰溜,對請求進(jìn)行過濾;

  • servlet:就是對request和response進(jìn)行處理的容器丁恭,它在filter之后執(zhí)行曹动,servlet其中的一部分就是controller層(標(biāo)記為servlet_2),還包括渲染視圖層(標(biāo)記為servlet_3)和進(jìn)入controller之前系統(tǒng)的一些處理部分(servlet_1)牲览,另外我們把servlet開始的時刻標(biāo)記為servlet_0墓陈,servlet結(jié)束的時刻標(biāo)記為servlet_4。

  • 攔截器(interceptor):就是對請求和返回進(jìn)行攔截,它作用在servlet的內(nèi)部贡必,具體來說有三個地方:
    1)servlet_1和servlet_2之間兔港,即請求還沒有到controller層
    2)servlet_2和servlet_3之間,即請求走出controller層次仔拟,還沒有到渲染時圖層
    3)servlet_3和servlet_4之間衫樊,即結(jié)束視圖渲染,但是還沒有到servlet的結(jié)束
    它們之間的關(guān)系利花,可以用一張圖來表示:

3.使用原則
對整個流程清楚之后科侈,然后就是各自的使用,在使用之前應(yīng)該有一個使用規(guī)則炒事,為什么這樣說臀栈,因為有些功能比如判斷用戶是否登錄,既可以用過濾器挠乳,也可以用攔截器权薯,用哪一個才是合理的呢?那么如果有一個原則睡扬,使用起來就會更加合理崭闲。

實(shí)際上這個原則是有的:把整個項目的流程比作一條河,那么監(jiān)聽器的作用就是能夠聽到河流里的所有聲音威蕉,過濾器就是能夠過濾出其中的魚刁俭,而攔截器則是攔截其中的部分魚,并且作標(biāo)記韧涨。所以當(dāng)需要監(jiān)聽到項目中的一些信息牍戚,并且不需要對流程做更改時,用監(jiān)聽器虑粥;當(dāng)需要過濾掉其中的部分信息如孝,只留一部分時,就用過濾器娩贷;當(dāng)需要對其流程進(jìn)行更改第晰,做相關(guān)的記錄時用攔截器。下面是具體的使用案例彬祖。

4.重新來看區(qū)別與聯(lián)系

下面從幾個方面闡述一下四個概念的區(qū)別與聯(lián)系:
1茁瘦、概念
2、生命周期
3储笑、職責(zé)
4甜熔、執(zhí)行過程


概念:

1、servlet:servlet是一種運(yùn)行服務(wù)器端的java應(yīng)用程序突倍,具有獨(dú)立于平臺和協(xié)議的特性腔稀,并且可以動態(tài)的生成web頁面盆昙,它工作在客戶端請求與服務(wù)器響應(yīng)的中間層。

2焊虏、filter:filter是一個可以復(fù)用的代碼片段淡喜,可以用來轉(zhuǎn)換HTTP請求、響應(yīng)和頭信息诵闭。Filter不像Servlet炼团,它不能產(chǎn)生一個請求或者響應(yīng),它只是修改對某一資源的請求涂圆,或者修改對某一資源的響應(yīng)们镜。

3币叹、listener:監(jiān)聽器润歉,從字面上可以看出listener主要用來監(jiān)聽用。通過listener可以監(jiān)聽web服務(wù)器中某一個執(zhí)行動作颈抚,并根據(jù)其要求作出相應(yīng)的響應(yīng)踩衩。通俗的語言說就是在application,session贩汉,request三個對象創(chuàng)建消亡或者往其中添加修改刪除屬性時自動執(zhí) 行代碼的功能組件驱富。

4、interceptor:攔截器

5匹舞、servlet褐鸥、filter、listener是配置到web.xml中赐稽,interceptor不配置到web.xml中叫榕,struts的攔截器配置到struts.xml中。spring的攔截器配置到spring.xml中姊舵。


生命周期:

1晰绎、servlet:servlet的生命周期始于它被裝入web服務(wù)器的內(nèi)存時,并在web服務(wù)器終止或重新裝入servlet時結(jié)束括丁。servlet一旦被裝入web服務(wù)器荞下,一般不會從web服務(wù)器內(nèi)存中刪除,直至web服務(wù)器關(guān)閉或重新結(jié)束史飞。
(1)尖昏、裝入:啟動服務(wù)器時加載Servlet的實(shí)例;
(2)构资、初始化:web服務(wù)器啟動時或web服務(wù)器接收到請求時会宪,或者兩者之間的某個時刻啟動。初始化工作有init()方法負(fù)責(zé)執(zhí)行完成蚯窥;
(3)掸鹅、調(diào)用:從第一次到以后的多次訪問塞帐,都是只調(diào)用doGet()或doPost()方法; (4)巍沙、銷毀:停止服務(wù)器時調(diào)用destroy()方法葵姥,銷毀實(shí)例。

2句携、filter:(一定要實(shí)現(xiàn)javax.servlet包的Filter接口的三個方法init()榔幸、doFilter()、destroy()矮嫉,空實(shí)現(xiàn)也行)
(1)削咆、啟動服務(wù)器時加載過濾器的實(shí)例,并調(diào)用init()方法來初始化實(shí)例蠢笋;
(2)拨齐、每一次請求時都只調(diào)用方法doFilter()進(jìn)行處理;
(3)昨寞、停止服務(wù)器時調(diào)用destroy()方法瞻惋,銷毀實(shí)例。

3援岩、listener:類似于servlet和filter
web.xml 的加載順序是:context- param -> listener -> filter -> servlet

4歼狼、interceptor:
以struts的攔截器為例,加載了struts.xml以后享怀,初始化相應(yīng)攔截器羽峰。當(dāng)action請求來時調(diào)用intercept方法,服務(wù)器停止銷毀interceptor添瓷。


職責(zé)
1梅屉、servlet:
創(chuàng)建并返回一個包含基于客戶請求性質(zhì)的動態(tài)內(nèi)容的完整的html頁面;
創(chuàng)建可嵌入到現(xiàn)有的html頁面中的一部分html頁面(html片段)仰坦;
讀取客戶端發(fā)來的隱藏數(shù)據(jù)履植;
讀取客戶端發(fā)來的顯示數(shù)據(jù);
與其他服務(wù)器資源(包括數(shù)據(jù)庫和java的應(yīng)用程序)進(jìn)行通信悄晃;
通過狀態(tài)代碼和響應(yīng)頭向客戶端發(fā)送隱藏數(shù)據(jù)玫霎。

2、filter:
filter能夠在一個請求到達(dá)servlet之前預(yù)處理用戶請求妈橄,也可以在離開servlet時處理http響應(yīng):
在執(zhí)行servlet之前庶近,首先執(zhí)行filter程序,并為之做一些預(yù)處理工作眷蚓;
根據(jù)程序需要修改請求和響應(yīng)鼻种;
在servlet被調(diào)用之后截獲servlet的執(zhí)行

3、listener:職責(zé)如概念沙热。
servlet2.4規(guī)范中提供了8個listener接口叉钥,可以將其分為三類罢缸,分別如下:
第一類:與servletContext有關(guān)的listner接口。包括:ServletContextListener投队、ServletContextAttributeListener
第二類:與HttpSession有關(guān)的Listner接口枫疆。包括:HttpSessionListner、 HttpSessionAttributeListener敷鸦、HttpSessionBindingListener息楔、 HttpSessionActivationListener;
第三類:與ServletRequest有關(guān)的Listener接口扒披,包括:ServletRequestListner值依、ServletRequestAttributeListener

4、interceptor:與過濾器十分相似碟案,通過層層攔截愿险,處理用戶的請求和響應(yīng)。
備注:web.xml 的加載順序是:context-param -> listener -> filter -> servlet 蟆淀。了解了這幾個概念的區(qū)別以后拯啦,不難理論這個加載順序了澡匪。


幾個區(qū)別:

1,servlet 流程是短的熔任,url傳來之后,就對其進(jìn)行處理疑苔,之后返回或轉(zhuǎn)向到某一自己指定的頁面。它主要用來在業(yè)務(wù)處理之前進(jìn)行控制.

2,filter 流程是線性的抢韭, url傳來之后薪贫,檢查之后,可保持原來的流程繼續(xù)向下執(zhí)行刻恭,被下一個filter, servlet接收等瞧省,而servlet 處理之后,不會繼續(xù)向下傳遞鳍贾。filter功能可用來保持流程繼續(xù)按照原來的方式進(jìn)行下去鞍匾,或者主導(dǎo)流程,而servlet的功能主要用來主導(dǎo)流程骑科。
filter可用來進(jìn)行字符編碼的過濾橡淑,檢測用戶是否登陸的過濾梁棠,禁止頁面緩存等

3, servlet,filter都是針對url之類的置森,而listener是針對對象的操作的,如session的創(chuàng)建符糊,session.setAttribute的發(fā)生暇藏,在這樣的事件發(fā)生時做一些事情。
可用來進(jìn)行:Spring整合Struts,為Struts的action注入屬性濒蒋,web應(yīng)用定時任務(wù)的實(shí)現(xiàn)瓮顽,在線人數(shù)的統(tǒng)計等

4,interceptor 攔截器围橡,類似于filter,不過在struts.xml中配置暖混,不是在web.xml,并且不是針對URL的,而是針對action,當(dāng)頁面提交 action時翁授,進(jìn)行過濾操作拣播,相當(dāng)于struts1.x提供的plug-in機(jī)制,可以看作收擦,前者是struts1.x自帶的filter,而 interceptor 是struts2 提供的filter.
與filter不同點(diǎn):
(1) 不在web.xml中配置贮配,而是在struts.xml中完成配置,與action在一起
(2) 可由action自己指定用哪個interceptor 在接收之前做事

5塞赂,struts2中的過濾器和攔截器的區(qū)別與聯(lián)系:
(1)泪勒、攔截器是基于java反射機(jī)制的,而過濾器是基于函數(shù)回調(diào)的宴猾。
(2)圆存、過濾器依賴與servlet容器,而攔截器不依賴與servlet容器仇哆。
(3)沦辙、攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用讹剔。
(4)油讯、攔截器可以訪問Action上下文、值棧里的對象辟拷,而過濾器不能撞羽。
(5)、在Action的生命周期中衫冻,攔截器可以多次調(diào)用诀紊,而過濾器只能在容器初始化時被調(diào)用一次。

6隅俘,
過濾器邻奠,是在java web中笤喳,你傳入的request,response提前過濾掉一些信息,或者提前設(shè)置一些參數(shù)碌宴,然后再傳入servlet或者struts的 action進(jìn)行業(yè)務(wù)邏輯杀狡,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者 struts的action前統(tǒng)一設(shè)置字符集贰镣,或者去除掉一些非法字符

攔截器呜象,是在面向切面編程的就是在你的service或者一個方法,前調(diào)用一個方法碑隆,或者在方法后調(diào)用一個方法比如動態(tài)代理就是攔截器的簡單實(shí)現(xiàn)恭陡,在你調(diào)用方法前打印出字符串(或者做其它業(yè)務(wù)邏輯的操作),也可以在你調(diào)用方法后打印出字符串上煤,甚至在你拋出異常的時候做業(yè)務(wù)邏輯的操作休玩。


執(zhí)行流程圖:

1、servlet:

2劫狠、filter:

3践磅、listener:

4碍讨、interceptor:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末黄橘,一起剝皮案震驚了整個濱河市信不,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌阐肤,老刑警劉巖凫佛,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讲坎,死亡現(xiàn)場離奇詭異孕惜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)晨炕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門衫画,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瓮栗,你說我怎么就攤上這事削罩。” “怎么了费奸?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵弥激,是天一觀的道長。 經(jīng)常有香客問我愿阐,道長微服,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任缨历,我火速辦了婚禮以蕴,結(jié)果婚禮上糙麦,老公的妹妹穿的比我還像新娘。我一直安慰自己丛肮,他們只是感情好赡磅,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宝与,像睡著了一般焚廊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上习劫,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天节值,我揣著相機(jī)與錄音,去河邊找鬼榜聂。 笑死搞疗,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的须肆。 我是一名探鬼主播匿乃,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼豌汇!你這毒婦竟也來了幢炸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拒贱,失蹤者是張志新(化名)和其女友劉穎宛徊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逻澳,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闸天,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了斜做。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苞氮。...
    茶點(diǎn)故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瓤逼,靈堂內(nèi)的尸體忽然破棺而出笼吟,到底是詐尸還是另有隱情,我是刑警寧澤霸旗,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布贷帮,位于F島的核電站,受9級特大地震影響诱告,放射性物質(zhì)發(fā)生泄漏撵枢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诲侮。 院中可真熱鬧镀虐,春花似錦、人聲如沸沟绪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绽慈。三九已至恨旱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坝疼,已是汗流浹背搜贤。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钝凶,地道東北人仪芒。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像耕陷,于是被迫代替她去往敵國和親掂名。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容