#Filter仔燕、Listener#JavaWeb學(xué)習(xí)筆記(2020/3/5)

一、Filter

作用:

1、登錄驗(yàn)證——不登錄不讓請(qǐng)求其他資源
2罪郊、關(guān)鍵字過(guò)濾
.....

使用方法:

  • 1橄维、創(chuàng)建一個(gè)Filter接口的實(shí)現(xiàn)類凛忿,重寫(xiě)接口中的抽象方法
public class FilterDemo1 implements Filter {
    public void init(FilterConfig config) throws ServletException {

    }
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        chain.doFilter(req, resp);
    }
    public void destroy() {
    }
}

Filter接口中的方法說(shuō)明:

  • ①.init方法:服務(wù)器啟動(dòng)時(shí)床牧,會(huì)創(chuàng)建Filter對(duì)象壕吹,調(diào)用唯一的一次init方法咒劲。

  • ②.doFilter方法:每次有過(guò)濾路徑的資源的請(qǐng)求,就調(diào)用一次。
    chain.doFilter(req, resp);作用是放行嫉父。

  • ③.destroy方法:服務(wù)器正常關(guān)閉前擂红,調(diào)用一次,一般用于釋放資源成榜。

  • 2挣输、用web.xml或者使用注解進(jìn)行配置

        1. web.xml配置    
            <filter>
                <filter-name>demo1</filter-name>
                <filter-class>cn.itcast.web.filter.FilterDemo1</filter-class>
            </filter>
            <filter-mapping>
                <filter-name>demo1</filter-name>
                <!-- 攔截路徑 -->
                <url-pattern>攔截路徑 </url-pattern>
            </filter-mapping>
        2.注解配置:
            @WebFilter(value = "攔截路徑" , dispatcherTypes={攔截方式,..} )

攔截路徑的寫(xiě)法:

  1. 具體資源路徑: /index.jsp 只有訪問(wèn)index.jsp資源時(shí),過(guò)濾器才會(huì)被執(zhí)行
  2. 攔截目錄: /user/* 訪問(wèn)/user下的所有資源時(shí),過(guò)濾器都會(huì)被執(zhí)行
  3. 后綴名攔截: *.jsp 訪問(wèn)所有后綴名為jsp資源時(shí),過(guò)濾器都會(huì)被執(zhí)行
  4. 攔截所有資源:/* 訪問(wèn)所有資源時(shí),過(guò)濾器都會(huì)被執(zhí)行

攔截方式的寫(xiě)法:

設(shè)置dispatcherTypes屬性
DispatcherType. REQUEST:默認(rèn)值。瀏覽器直接請(qǐng)求資源
DispatcherType. FORWARD:轉(zhuǎn)發(fā)訪問(wèn)資源
DispatcherType. INCLUDE:包含訪問(wèn)資源
DispatcherType. ERROR:錯(cuò)誤跳轉(zhuǎn)資源
DispatcherType. ASYNC:異步訪問(wèn)資源

過(guò)濾器鏈:就好比幾層的篩子舅踪。

過(guò)濾器的執(zhí)行流程:
1. 過(guò)濾器1
2. 過(guò)濾器2
3. 資源執(zhí)行
4. 過(guò)濾器2
5. 過(guò)濾器1


圖片.png

過(guò)濾器先后順序問(wèn)題:

  1. 注解配置:按照類名的字符串比較規(guī)則比較皮胡,值小的先執(zhí)行
  • 如: AFilter 和 BFilter烹笔,AFilter就先執(zhí)行了亿鲜。
  1. web.xml配置: <filter-mapping>誰(shuí)定義在上邊垒探,誰(shuí)先執(zhí)行

二夷蚊、動(dòng)態(tài)代理實(shí)現(xiàn)request對(duì)象增強(qiáng)

代理模式是一種設(shè)計(jì)模式
所謂代理就是第三方箱歧,去調(diào)用原來(lái)的方法并且在此之上進(jìn)行一些功能的增強(qiáng)微谓,何為動(dòng)態(tài)代理姻氨,就是使用反射技術(shù)進(jìn)行實(shí)現(xiàn),不用依賴于具體的類文件乘粒。

關(guān)于代理的概念:

    1. 真實(shí)對(duì)象:被代理的對(duì)象
    1. 代理對(duì)象:真實(shí)對(duì)象增強(qiáng)之后的對(duì)象。
    1. 代理模式:代理對(duì)象代理真實(shí)對(duì)象系谐,達(dá)到增強(qiáng)真實(shí)對(duì)象功能的目的。

動(dòng)態(tài)代理的實(shí)現(xiàn)步驟:

    1. 代理對(duì)象和真實(shí)對(duì)象實(shí)現(xiàn)相同的接口
    1. 代理對(duì)象 = Proxy.newProxyInstance();
    1. 使用代理對(duì)象調(diào)用方法向叉。
    1. 增強(qiáng)方法

newProxyInstance()方法的參數(shù)列表:

  真實(shí)對(duì)象.getClass().getClassLoader()——類加載器,把真實(shí)對(duì)象的Class對(duì)象加載進(jìn)入內(nèi)存演顾。
  真實(shí)對(duì)象.getClass().getInterfaces()——獲取所有的接口的Class對(duì)象
  new InvocationHandler(){
  代理對(duì)象調(diào)用所有的方法都會(huì)執(zhí)行此方法,調(diào)用的方法對(duì)象會(huì)傳給method參數(shù)佑钾。
  代理對(duì)象調(diào)用方法的參數(shù)會(huì)傳遞給args數(shù)組對(duì)象孽尽。
  匿名內(nèi)部類實(shí)現(xiàn) invoke(Object proxy, Method method, Object[] args) 方法
}

敏感字過(guò)濾器

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
//攔截資源路徑為testSensitiveFilterServlet
@WebFilter("/testSensitiveFilterServlet")
public class SensitivewordsFilter implements Filter {
    List<String> sensitiveWordsList = new ArrayList<String>();
    public void init(FilterConfig config) throws ServletException {
        try{
            String realPath = config.getServletContext().getRealPath("/WEB-INF/classes/words.txt");
            System.out.println(realPath);
            BufferedReader br = new BufferedReader(new FileReader(realPath));
            String line = null;
            while((line = br.readLine())!=null){
                sensitiveWordsList.add(line);
            }
            System.out.println(sensitiveWordsList);
        }catch (Exception e){
            e.printStackTrace();
        }

    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //使用動(dòng)態(tài)代理來(lái)增強(qiáng)getParameter方法,完成過(guò)濾工作

        ServletRequest proxy_Requset = (ServletRequest)Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            //調(diào)用getParameter方法method就是getParameter方法對(duì)象
            //args是getParameter(String str)的str數(shù)據(jù)。
            //調(diào)用setAttribute方法method就是setAttribute方法對(duì)象
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                if ("getParameter".equals(method.getName())){
                    String msg = (String) method.invoke(req,args);
                    for (String s : sensitiveWordsList) {
                        if (msg.contains(s)){
                            msg = msg.replaceAll(s,"***");
                        }
                    }
                    return msg;
                }
                return method.invoke(req,args);
            }
        });
        chain.doFilter(proxy_Requset, resp);
    }


    public void destroy() {
    }


}

三、監(jiān)聽(tīng)器Listener

Web三大技術(shù):Servlet、Filter磅轻、Listener

事件監(jiān)聽(tīng)機(jī)制

  • 事件 :一件事情
  • 事件源 :事件發(fā)生的地方
  • 監(jiān)聽(tīng)器 :一個(gè)對(duì)象
  • 注冊(cè)監(jiān)聽(tīng):將事件买雾、事件源、監(jiān)聽(tīng)器綁定在一起浪慌。 當(dāng)事件源上發(fā)生某個(gè)事件后侦啸,執(zhí)行監(jiān)聽(tīng)器代碼

ServletContextListener:web容器監(jiān)聽(tīng)器
監(jiān)聽(tīng)ServletContext對(duì)象的創(chuàng)建和銷毀

  • 方法:
    • void contextDestroyed(ServletContextEvent sce) :ServletContext對(duì)象被銷毀之前會(huì)調(diào)用該方法
    • void contextInitialized(ServletContextEvent sce) :ServletContext對(duì)象創(chuàng)建后會(huì)調(diào)用該方法
  • 步驟:
      1. 定義一個(gè)ServletContextListener的實(shí)現(xiàn)類,重寫(xiě)接口的抽象方法丧枪。
      1. 配置
        1. web.xml
    <listener>
             <listener-class>監(jiān)聽(tīng)器類的路徑</listener-class>
    </listener>
   <!-- 指定初始化參數(shù),一般用來(lái)加載默認(rèn)配置 -->
   <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/classes/applicationContext.xml</param-value>
   </context-param>

//使用servletContext.getInitParameter("contextConfigLocation");就能獲取到param-value里的值光涂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拧烦,隨后出現(xiàn)的幾起案子忘闻,更是在濱河造成了極大的恐慌,老刑警劉巖恋博,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件齐佳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡债沮,警方通過(guò)查閱死者的電腦和手機(jī)炼吴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)疫衩,“玉大人缺厉,你說(shuō)我怎么就攤上這事∷硗粒” “怎么了提针?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)曹傀。 經(jīng)常有香客問(wèn)我辐脖,道長(zhǎng),這世上最難降的妖魔是什么皆愉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任嗜价,我火速辦了婚禮,結(jié)果婚禮上幕庐,老公的妹妹穿的比我還像新娘久锥。我一直安慰自己,他們只是感情好异剥,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布瑟由。 她就那樣靜靜地躺著,像睡著了一般冤寿。 火紅的嫁衣襯著肌膚如雪歹苦。 梳的紋絲不亂的頭發(fā)上青伤,一...
    開(kāi)封第一講書(shū)人閱讀 49,985評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音殴瘦,去河邊找鬼狠角。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蚪腋,可吹牛的內(nèi)容都是我干的丰歌。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼屉凯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼立帖!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起神得,我...
    開(kāi)封第一講書(shū)人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤厘惦,失蹤者是張志新(化名)和其女友劉穎偷仿,沒(méi)想到半個(gè)月后哩簿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酝静,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年节榜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片别智。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宗苍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出薄榛,到底是詐尸還是另有隱情讳窟,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布敞恋,位于F島的核電站丽啡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏硬猫。R本人自食惡果不足惜补箍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望啸蜜。 院中可真熱鬧坑雅,春花似錦、人聲如沸衬横。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蜂林。三九已至蛹尝,卻和暖如春后豫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背突那。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工挫酿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人愕难。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓早龟,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親猫缭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子葱弟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

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