這周工作有點(diǎn)忙,,本來想著休息一周再寫「電子書」的,,但上周的Spring「在看」超出了期望,所以又只能肝了,。 不少讀者催我寫「過濾器和監(jiān)聽器」,,于是我就又來了。 不要問我為什么好像讀者評論『SpringMVC』多一點(diǎn),,三歪你怎么不寫『SpringMVC』,,而來寫『過濾器和監(jiān)聽器』。你們的在看和轉(zhuǎn)發(fā)都是『下次一定』,,那我也『下次一定』(瘋狂暗示) 什么是過濾器,?我們很容易發(fā)現(xiàn),過濾器可以比喻成一張濾網(wǎng),。我們想想現(xiàn)實(shí)中的濾網(wǎng)可以做什么:在泡茶的時(shí)候,,過濾掉茶葉。那濾網(wǎng)是怎么過濾茶葉的呢?規(guī)定大小的網(wǎng)孔,,只要網(wǎng)孔比茶葉小,就可以實(shí)現(xiàn)過濾了,! 引申在Web容器中,,過濾器可以做:過濾一些敏感的字符串【規(guī)定不能出現(xiàn)敏感字符串】、避免中文亂碼【規(guī)定Web資源都使用UTF-8編碼】,、權(quán)限驗(yàn)證等等等,,過濾器的作用非常大,只要發(fā)揮想象就可以有意想不到的效果 這次的PDF共有「58」頁,,PDF涉及到的內(nèi)容:
過濾器的知識點(diǎn)「學(xué)某項(xiàng)技術(shù)之前,,首先要知道它能干什么,學(xué)了這項(xiàng)技術(shù)有什么好處,,再細(xì)學(xué)」 知道了什么是過濾器以后,,其實(shí)我們學(xué)的東西就不是很多了,感覺花半天就能學(xué)完了,。 首先,,我們來認(rèn)識一下 學(xué)過我之前的「Servlet」教程,,對 而 我們可以這樣理解:過濾器不單單只有一個(gè),那么我們怎么管理這些過濾器呢,?在Java中就使用了鏈?zhǔn)浇Y(jié)構(gòu),。把所有的過濾器都放在FilterChain里邊,如果符合條件,,就執(zhí)行下一個(gè)過濾器(如果沒有過濾器了,,就執(zhí)行目標(biāo)資源)。 上面的話好像有點(diǎn)拗口,,我們可以想象生活的例子:現(xiàn)在我想在茶杯上能過濾出石頭和茶葉出來,。石頭在一層,茶葉在一層,。所以茶杯的過濾裝置應(yīng)該有兩層濾網(wǎng),。這個(gè)過濾裝置就是FilterChain,過濾石頭的濾網(wǎng)和過濾茶葉的濾網(wǎng)就是Filter,。在石頭濾網(wǎng)中,,茶葉是屬于下一層的,就把茶葉放行,,讓茶葉的濾網(wǎng)過濾茶葉,。過濾完茶葉了,,剩下的就是茶 對上面的API了解完了以后,我們試著自己寫一個(gè)過濾器(實(shí)際上就是實(shí)現(xiàn)Filter接口,,重寫 隨后看一下FilterChain的執(zhí)行順序是不是自己配置的那樣,,再寫幾個(gè)常見的過濾器應(yīng)用就好了,,比如說「禁止瀏覽器緩存」「實(shí)現(xiàn)自動(dòng)登錄」「編碼過濾器」「敏感詞過濾器」「壓縮資源過濾器」「HTML轉(zhuǎn)義過濾器」「緩存數(shù)據(jù)」… 工作中用「過濾器」多嗎?三歪在工作時(shí)間不長哈,,接觸了好多些系統(tǒng),,由我們自己去寫「過濾器」的場景還是不多的。但我覺得有一點(diǎn)可以好好學(xué)學(xué),,就是「責(zé)任鏈模式」,。 之前為啥我寫了一篇「責(zé)任鏈模式」,其實(shí)就是這個(gè)設(shè)計(jì)模式在系統(tǒng)中用得挺多的,,號稱能搞掂 過濾器其實(shí)也是責(zé)任鏈模式的一種實(shí)現(xiàn),F(xiàn)ilterChain層層往下執(zhí)行,,直到最后沒有過濾器,,就到了「目標(biāo)資源」 什么是監(jiān)聽器?監(jiān)聽器就是一個(gè)實(shí)現(xiàn)特定接口的普通Java程序,,這個(gè)程序?qū)iT用于監(jiān)聽一個(gè)Java對象的方法調(diào)用或?qū)傩愿淖?/strong>,,當(dāng)被監(jiān)聽對象發(fā)生上述事件后,監(jiān)聽器某個(gè)方法將立即被執(zhí)行,。 上面這句話應(yīng)該也很好理解,,比如說我有一個(gè)
回到Servlet層面上,我們更多的監(jiān)聽的是「Session」「Request」「ServletContext」這幾個(gè)對象的創(chuàng)建/銷毀/屬性內(nèi)的變化,。 針對監(jiān)聽上面的幾個(gè)對象,,我們可以做出一些小例子,比如說「統(tǒng)計(jì)網(wǎng)站的在線人數(shù)」「自動(dòng)踢人」「定時(shí)清除Session的值」 監(jiān)聽器在工作中用得多嗎?監(jiān)聽器在寫業(yè)務(wù)代碼的時(shí)候,,同樣也用得不多,,我?guī)缀鯖]怎么寫過監(jiān)聽器的代碼。 但是理解監(jiān)聽器這個(gè)概念我覺得還是很有必要的,。以我的理解,,大概可以認(rèn)為「A發(fā)生了變化,B需要依賴A發(fā)生的變化做出處理」,,這就是監(jiān)聽器。 有人認(rèn)為,,這不就是「事件驅(qū)動(dòng)」嗎,?我覺得也可以那樣理解。 監(jiān)聽器和過濾器再總結(jié)監(jiān)聽器和過濾器在工作中可能讓我們自己「手寫」的概率不是很大,,但我覺得這兩個(gè)技術(shù)還是需要了解的,。如果你了解過Struts2,你就會(huì)發(fā)現(xiàn)Struts2就是用的過濾器來實(shí)現(xiàn)很多的功能,。監(jiān)聽器在Spring源碼里邊也有很多的實(shí)現(xiàn),,我覺得都可以看看。 過濾器和監(jiān)聽器還是需要理解它的思想,,這塊對我們學(xué)習(xí)Spring也是很有幫助的,。 現(xiàn)在已經(jīng)工作有一段時(shí)間了,為什么還來寫
|
|