Filter過濾器

Filter過濾器

簡介

filter可以認為是servlet的一種加強版换薄,主要用于對用戶請求request進行預處理毒涧,也可以對response進行后處理副签,是個典型的處理鏈论衍。使用filter的完整流程是,filter對用戶請求進行預處理楣责,接著將請求HttpServletRequest交給Servlet處理并生成響應竣灌。最后Filter再對服務器響應HttpServletResponse進行后處理聂沙。Servlet與Servlet具有完全相同的生命周期,而Filter也可以通過<<init-para>init-para>進行初始化參數(shù)的配置初嘹,并通過FilterConfig傳送給filter

創(chuàng)建Filter過濾器的兩步

創(chuàng)建一個Filter只需兩步

  • 創(chuàng)建Filter處理類及汉,即實現(xiàn)javax.servlet.Filter接口
  • web.xml文件中配置filter
javax.servlet.Filter接口介紹

Filter必須實現(xiàn)javax.servlet.Filter接口,在該接口中定義了三個方法

  • void init(FilterConfig config):用于Filter的初始化屯烦,F(xiàn)ilterConfig用于訪問Filter的配置信息
  • void destroy():用于Filter銷毀前坷随,某些資源的釋放回收
    *void doFilter(ServletRequest request,ServletResponse response驻龟,F(xiàn)ilterChain chain):實現(xiàn)過濾功能的核心方法温眉,該方法是對每個請求及響應增加額外的處理,該方法實現(xiàn)對用戶請求request進行預處理翁狐,也可以實現(xiàn)對服務器響應response進行后處理---它們的分界線為是否調(diào)用了chain.doFilter(request类溢,response),執(zhí)行該方法之前露懒,即對用戶請求request進行預處理闯冷,執(zhí)行該方法之后,即對服務器響應response進行后處理懈词。
web.xml配置介紹
<filter-name>用于為過濾器指定一個名字蛇耀,該元素的內(nèi)容不能為空。 
<filter-class>元素用于指定過濾器的完整的限定類名坎弯。 
<init-param>元素用于為過濾器指定初始化參數(shù)纺涤,它的子元素<param-name>指定參數(shù)的名字,<param-value>指定參數(shù)的值抠忘。
在過濾器中撩炊,可以使用FilterConfig接口對象來訪問初始化參數(shù)。

<filter-mapping>元素用于設置一個 Filter 所負責攔截的資源褐桌。一個Filter攔截的資源可通過兩種方式來指定:Servlet 名稱和資源訪問的請求路徑 
<filter-name>子元素用于設置filter的注冊名稱。該值必須是在<filter>元素中聲明過的過濾器的名字 
<url-pattern>設置 filter 所攔截的請求路徑(過濾器關聯(lián)的URL樣式) 
<servlet-name>指定過濾器所攔截的Servlet名稱象迎。 
<dispatcher>指定過濾器所攔截的資源被 Servlet 容器調(diào)用的方式荧嵌,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默認REQUEST砾淌。用戶可以設置多個<dispatcher> 子元素用來指定 Filter 對資源的多種調(diào)用方式進行攔截啦撮。 

<dispatcher> 子元素可以設置的值及其意義: 
REQUEST:當用戶直接訪問頁面時,Web容器將會調(diào)用過濾器汪厨。如果目標資源是通過RequestDispatcher的include()或forward()方法訪問時赃春,那么該過濾器就不會被調(diào)用。 
INCLUDE:如果目標資源是通過RequestDispatcher的include()方法訪問時劫乱,那么該過濾器將被調(diào)用织中。除此之外锥涕,該過濾器不會被調(diào)用。 
FORWARD:如果目標資源是通過RequestDispatcher的forward()方法訪問時狭吼,那么該過濾器將被調(diào)用层坠,除此之外,該過濾器不會被調(diào)用刁笙。 
ERROR:如果目標資源是通過聲明式異常處理機制調(diào)用時破花,那么該過濾器將被調(diào)用。除此之外疲吸,過濾器不會被調(diào)用座每。

Filters使用案例

Example1:自己對相應業(yè)務寫一個實現(xiàn)Filter接口的類
<!-- 請求url日志記錄過濾器 -->    
    <filter>    
        <filter-name>logfilter</filter-name>    
        <filter-class>com.weijia.filterservlet.LogFilter</filter-class>    
    </filter>    
    <filter-mapping>    
        <filter-name>logfilter</filter-name>    
        <url-pattern>/*</url-pattern>    
    </filter-mapping>  


package com.weijia.filterservlet;  
  
import java.io.IOException;  
import java.util.Enumeration;  
import java.util.HashMap;  
  
import javax.servlet.Filter;  
import javax.servlet.FilterChain;  
import javax.servlet.FilterConfig;  
import javax.servlet.ServletException;  
import javax.servlet.ServletRequest;  
import javax.servlet.ServletResponse;  
  
public class EncodingFilter implements Filter {    
    private String encoding;    
    private HashMap<String,String> params = new HashMap<String,String>();    
    // 項目結束時就已經(jīng)進行銷毀    
    public void destroy() {    
        System.out.println("end do the encoding filter!");    
        params=null;    
        encoding=null;    
    }    
    public void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {    
        System.out.println("before encoding " + encoding + " filter!");    
        req.setCharacterEncoding(encoding);    
        chain.doFilter(req, resp);          
        System.out.println("after encoding " + encoding + " filter摘悴!");    
        System.err.println("----------------------------------------");    
    }    
     
    // 項目啟動時就已經(jīng)進行讀取    
    public void init(FilterConfig config) throws ServletException {    
        System.out.println("begin do the encoding filter!");    
        encoding = config.getInitParameter("encoding");    
        for (Enumeration<?> e = config.getInitParameterNames(); e.hasMoreElements();) {    
            String name = (String) e.nextElement();    
            String value = config.getInitParameter(name);    
            params.put(name, value);    
        }    
    }    
 }    
Example2:防止中文亂碼過濾器
<filter>
    <filter-name>encoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name><!--用來指定一個具體的字符集-->
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name><!--true:無論request是否指定了字符集峭梳,都是用encoding;false:如果request已指定一個字符集烦租,則不使用encoding-->
        <param-value>false</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

參考文章&&推薦閱讀

Filter過濾器
JavaWeb學習篇之----Servlet過濾器Filter和監(jiān)聽器

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末延赌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子叉橱,更是在濱河造成了極大的恐慌挫以,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窃祝,死亡現(xiàn)場離奇詭異掐松,居然都是意外死亡,警方通過查閱死者的電腦和手機粪小,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門大磺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人探膊,你說我怎么就攤上這事杠愧。” “怎么了逞壁?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵流济,是天一觀的道長。 經(jīng)常有香客問我腌闯,道長绳瘟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任姿骏,我火速辦了婚禮糖声,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己蘸泻,他們只是感情好琉苇,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蟋恬,像睡著了一般翁潘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上歼争,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天拜马,我揣著相機與錄音,去河邊找鬼沐绒。 笑死俩莽,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的乔遮。 我是一名探鬼主播扮超,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蹋肮!你這毒婦竟也來了出刷?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤坯辩,失蹤者是張志新(化名)和其女友劉穎馁龟,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漆魔,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡坷檩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了改抡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矢炼。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖阿纤,靈堂內(nèi)的尸體忽然破棺而出句灌,到底是詐尸還是另有隱情,我是刑警寧澤欠拾,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布胰锌,位于F島的核電站,受9級特大地震影響清蚀,放射性物質(zhì)發(fā)生泄漏匕荸。R本人自食惡果不足惜爹谭,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一枷邪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦东揣、人聲如沸践惑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尔觉。三九已至,卻和暖如春芥吟,著一層夾襖步出監(jiān)牢的瞬間侦铜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工钟鸵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钉稍,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓棺耍,卻偏偏與公主長得像贡未,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蒙袍,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

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