JavaEE-Servlet-Filter和Listener

一.過濾器Filter

對(duì)指定的web資源進(jìn)行攔截,實(shí)現(xiàn)一些特殊功能,如實(shí)現(xiàn)URL權(quán)限訪問鸦泳、過濾敏感詞等等

1).注冊過濾器

方式一
    在WEB-INF/web.xml注冊
    <filter>
        <filter-name>filter</filter-name>
        <filter-class>com.xxx.xxFilter</filter-class>
        <init-param>
            <param-name>name1</param-name>
            <param-value>value1</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>filter</filter-name>       
        <url-pattern>/*</url-pattern> 指定要攔截的url
        <servlet-name>xxxServlet</servlet-name> 指定要攔截的Servlet
        <dispatcher>REQUEST</dispatcher> 指定要攔截資源的訪問方式是REQUEST/FORWARD/INCLUDE/ERROR,默認(rèn)REQUEST
    </filter-mapping>

方式二
    在com.xxx.xxFilter類添加注解
    @WebFilter(filterName="filter",urlPatterns={"/*"},servletNames={"Demo1Servlet"})

2).實(shí)現(xiàn)接口

創(chuàng)建: web應(yīng)用加載時(shí),創(chuàng)建所有過濾器對(duì)象,調(diào)用init()初始化,一直駐留內(nèi)存;
銷毀: web應(yīng)用移除時(shí),銷毀所有過濾器對(duì)象,銷毀前調(diào)用destroy()善后 
public class xxFilter implements Filter {
    public void destroy() {     
    }

    // 每次攔截資源后調(diào)用
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        FilterChain過濾器鏈對(duì)象,一個(gè)資源可能被多個(gè)過濾器所攔截,攔截順序是web.xml中filter-mapping配置順序
        FilterChain.doFilter()一旦被調(diào)用,就執(zhí)行過濾器鏈的下一個(gè)節(jié)點(diǎn),若當(dāng)前是最后過濾器,則執(zhí)行目標(biāo)資源
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        filterConfig.getInitParameter(String name) 獲取web.xml過濾器配置信息
        filterConfig.getServletContext() 獲取ServletContext對(duì)象
    }
}

二.監(jiān)聽器Listener

Servlet監(jiān)聽器: 監(jiān)聽ServletContext、Session和Request域的變化词身。

1.監(jiān)聽三大作用域的創(chuàng)建和銷毀

1)注冊監(jiān)聽器
    方式一
    在WEB-INF/web.xml注冊
    <listener>
        <listener-class>com.xxx.xxx</listener-class>
    </listener>
    
    方式二
    在com.xxx.xxx類添加注解@WebListener

2)實(shí)現(xiàn)監(jiān)聽器接口
    public class xxx implements ServletContextListener {            
        // ServletContext創(chuàng)建: web應(yīng)用被加載時(shí)創(chuàng)建
        public void contextDestroyed(ServletContextEvent sce) {         
        }
        
        // ServletContext銷毀: web應(yīng)用被移除時(shí)銷毀
        public void contextInitialized(ServletContextEvent sce) {           
        }           
    }
    應(yīng)用場景: 保存全局對(duì)象,如:創(chuàng)建數(shù)據(jù)庫連接池; 加載框架配置文件;實(shí)現(xiàn)任務(wù)調(diào)度定時(shí)器

    public class xxx implements HttpSessionListener {
        // Session創(chuàng)建:首次調(diào)用request.getSession()時(shí)創(chuàng)建
        public void sessionCreated(HttpSessionEvent se) {
        }
        
        // Session銷毀:超30分鐘沒用時(shí)銷毀 /調(diào)用invalidate()銷毀 
        // 服務(wù)器非正常關(guān)閉時(shí)銷毀(正常關(guān)閉則被鈍化,再次開啟則被活化)
        public void sessionDestroyed(HttpSessionEvent se) {
        }
    }
    
    public class xxx implements ServletRequestListener {
        // Request創(chuàng)建:瀏覽器請(qǐng)求開始時(shí)創(chuàng)建     
        public void requestDestroyed(ServletRequestEvent sre) {         
        }
        
        // Request銷毀:瀏覽器請(qǐng)求結(jié)束時(shí)銷毀
        public void requestInitialized(ServletRequestEvent sre) {       
        }
    }

2.監(jiān)聽三大作用域?qū)傩缘脑鰟h改

public class xxx implements ServletContextAttributeListener {
    public void attributeAdded(ServletContextAttributeEvent scab) {
        System.out.println("屬性加入"+scab.getName()+":"+scab.getValue());
    }

    public void attributeRemoved(ServletContextAttributeEvent scab) {
        System.out.println("屬性移除"+scab.getName()+":"+scab.getValue());
    }

    public void attributeReplaced(ServletContextAttributeEvent scab) {
        System.out.println("屬性替換"+scab.getName()+":"+scab.getValue()+
        ":"+scab.getServletContext().getAttribute(scab.getName()));
    }
}

public class xxx implements HttpSessionAttributeListener {
    public void attributeAdded(HttpSessionBindingEvent se) {
    }

    public void attributeRemoved(HttpSessionBindingEvent se) {
    }

    public void attributeReplaced(HttpSessionBindingEvent se) {
    }
}

public class xxx implements ServletRequestAttributeListener {
    public void attributeAdded(ServletRequestAttributeEvent srae) {
    }
    public void attributeRemoved(ServletRequestAttributeEvent srae) {
    }
    public void attributeReplaced(ServletRequestAttributeEvent srae) {
    }
}

3.監(jiān)聽JavaBean對(duì)象在Session域中的變化

public class JavaBean類 implements HttpSessionBindingListener ,HttpSessionActivationListener{
    ...
    // javabean對(duì)象被綁到session
    public void valueBound(HttpSessionBindingEvent event) {         
    }
    
    // javabean對(duì)象被移出session
    public void valueUnbound(HttpSessionBindingEvent event) {           
    }
    
    // javabean對(duì)象隨session活化
    public void sessionDidActivate(HttpSessionEvent se) {
    }

    // javabean對(duì)象隨session鈍化
    public void sessionWillPassivate(HttpSessionEvent se) {
    }
}

簡書: http://www.reibang.com/p/46e5b3bf42d7
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/54791009
GitHub博客:http://lioil.win/2017/01/30/Servlet-Listener.html
Coding博客:http://c.lioil.win/2017/01/30/Servlet-Listener.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末井赌,一起剝皮案震驚了整個(gè)濱河市积锅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖网缝,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蟋定,居然都是意外死亡粉臊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門驶兜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扼仲,“玉大人,你說我怎么就攤上這事抄淑⊥佬祝” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵肆资,是天一觀的道長矗愧。 經(jīng)常有香客問我,道長迅耘,這世上最難降的妖魔是什么贱枣? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮颤专,結(jié)果婚禮上纽哥,老公的妹妹穿的比我還像新娘。我一直安慰自己栖秕,他們只是感情好春塌,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著簇捍,像睡著了一般只壳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上暑塑,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天吼句,我揣著相機(jī)與錄音,去河邊找鬼事格。 笑死惕艳,一個(gè)胖子當(dāng)著我的面吹牛搞隐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播远搪,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼劣纲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谁鳍?” 一聲冷哼從身側(cè)響起癞季,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎倘潜,沒想到半個(gè)月后绷柒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窍荧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年辉巡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蕊退。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡郊楣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瓤荔,到底是詐尸還是另有隱情净蚤,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布输硝,位于F島的核電站今瀑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏点把。R本人自食惡果不足惜橘荠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望郎逃。 院中可真熱鬧哥童,春花似錦、人聲如沸褒翰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽优训。三九已至朵你,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間揣非,已是汗流浹背抡医。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留早敬,地道東北人魂拦。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓毛仪,卻偏偏與公主長得像搁嗓,于是被迫代替她去往敵國和親芯勘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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

  • 監(jiān)聽器(listener) 監(jiān)聽器簡介 :監(jiān)聽器就是一個(gè)實(shí)現(xiàn)特定接口的普通java程序腺逛,這個(gè)程序?qū)iT用于監(jiān)聽另一個(gè)...
    奮斗的老王閱讀 2,517評(píng)論 0 53
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理荷愕,服務(wù)發(fā)現(xiàn),斷路器棍矛,智...
    卡卡羅2017閱讀 134,699評(píng)論 18 139
  • 本文包括:1安疗、Listener簡介2、Servlet監(jiān)聽器3够委、監(jiān)聽三個(gè)域?qū)ο髣?chuàng)建和銷毀的事件監(jiān)聽器4荐类、監(jiān)聽三個(gè)域?qū)?..
    廖少少閱讀 6,086評(píng)論 6 28
  • Servlet過濾器是 Servlet 程序的一種特殊用法,主要用來完成一些通用的操作茁帽,如編碼的過濾玉罐、判斷用戶的登...
    重山楊閱讀 1,239評(píng)論 0 12
  • 這部分主要是與Java Web和Web Service相關(guān)的面試題。 96潘拨、闡述Servlet和CGI的區(qū)別? 答...
    雜貨鋪老板閱讀 1,411評(píng)論 0 10