Javaweb基礎(九)過濾器監(jiān)聽器

過濾器(Filter):

能夠完成篩選不需要數(shù)據(jù)的工具(東西).

1.什么是過濾器

生活中:凈水器,香煙過濾嘴,濾紙,丈母娘,收費站等.------->單向的.
Web中:過濾器其實就是服務端的一個程序(程序的最小單元就是類).
在Web開發(fā)中,過濾器其實就是一個Web組件(Servlet/Filter/Listener),其實就是一個特殊的類.
一個類實現(xiàn)javax.servlet.Servlet接口:--->Servlet類.
一個類實現(xiàn)javax.servlet.Filter接口:----->Filter類.

2.過濾器的作用:

過濾器可以對所有的請求或者響應做攔截操作.

  • 1:以常規(guī)的方式調(diào)用資源(Servlet/JSP);
  • 2:利用修改過的請求信息調(diào)用資源;
  • 3:調(diào)用資源之后,但在響應到客戶端之前,對響應做出修改;
  • 4:阻止當前資源調(diào)用,代之轉到其他資源.
Paste_Image.png

Filter開發(fā)和使用

過濾器的開發(fā)和Servlet非常相似:(類比學習)

1.開發(fā)Servlet:

1):自定義一個類(XxxServlet),實現(xiàn)于javax.servlet.Servlet接口(繼承于HttpServlet類).
2):在web.xml中做配置,告訴Tomcat來幫我管理這一個類(負責了該類的生命周期).:@WebServlet("/xxx")

     <servlet>
          <servlet-name>XxxServlet</servlet-name>
          <servlet-class>XxxServlet類的全限定名</servlet-class>
     </servlet>
     <servlet-mapping>
          <servlet-name>XxxServlet</servlet-name>
          <!--向外暴露一個資源名稱,目的:讓客戶端通過該資源名稱來訪問服務端對應的一個Servlet-->
          <url-pattern>/xxx</url-pattern>
     </servlet-mapping>

2.開發(fā)Filter:

1):自定義一個類(XxxFilter,Xxx表示功能名),實現(xiàn)于javax.servlet.Filter接口.
2):在web.xml中做配置,告訴Tomcat來幫我管理這一個類(負責了該類的生命周期).:@WebFilter("/hello.jsp")

     <filter>
          <filter-name>XxxFilter</filter-name>
          <filter-class>XxxFilter類的全限定名</filter-class>
     </filter>
     filter-mapping>
          <filter-name>XxxFilter</filter-name>
          <!--表示:當前Filter只對哪些資源做過濾/攔截操作,只對hello.jsp做攔截-->
          <url-pattern>/hello.jsp</url-pattern>
     </filter-mapping>

3.Filter的生命周期方法:

  • 1):void init(FilterConfig config): 初始化方法
  • 2):void doFilter(ServletRequest request, ServletResponse response, FilterChain chain):執(zhí)行過濾的方法(每一次請求都會執(zhí)行過濾)
  • 3):void destroy():銷毀方法
    執(zhí)行的流程:
    在啟動Tomcat服務器的時候,就會執(zhí)行構造器和init方法.
    構造器--->init方法 -----> ( doFilter方法 )N次------->destroy方法

chain:鏈,鏈條,多個鏈的節(jié)點組合而成.
FilterChain:過濾器鏈,多個過濾器按照一定的順序排列在一起. FilterChain.doFilter(req,resp):放行(放行給下一個Filter或資源)

Paste_Image.png

4.Filter映射細節(jié):

  • 1):多個Filter共存的時候,攔截的先后順序由誰來決定?
    由<filter-mapping>的配置先后順序來決定.
  • 2):Filter的對哪些資源做過濾.
    <url-pattern>被過濾的資源名稱</url-pattern>
方式 作用域
<url-pattern>/hello.jsp</url-pattern> 只對/hello.jsp做過濾.
<url-pattern>/*</url-pattern> 對所有的資源做過濾操作.
<url-pattern>/system/*</url-pattern> 只對以/system/打頭的資源做過濾.
<url-pattern>*.do</url-pattern> 只對以.do結尾的資源做過濾
  • 3):可以通過<init-param>元素來給當前Filter配置初始化參數(shù).
    通過FilterConifg對象.getInitParameter(String name)來獲取初始化參數(shù).
  • 4):Servlet,Filter,Listener都屬于Web組件.
    一般的,先配置監(jiān)聽器,再配置過濾器,最后配置Servlet.
  • 5):<filter-mapping>中的子元素<dispatcher>表示對哪些操作執(zhí)行過濾.
<!-- 缺省情況:REQUEST -->
<dispatcher>REQUEST</dispatcher>

<!-- 對請求轉發(fā)做攔截 -->
<dispatcher>FORWARD</dispatcher>

<!-- 對請求包含做攔截 -->
<dispatcher>INCLUDE</dispatcher>

<!-- 出錯之后再跳轉到全局的結果視圖之前做攔截 -->
<dispatcher>ERROR</dispatcher>

請求編碼過濾器:CharacterEncodingFilter

Paste_Image.png
Paste_Image.png
Paste_Image.png

Paste_Image.png

上述編碼過濾器,沒問題.但是卻把字符編碼寫死了.
解決方案:把字符編碼作為Filter的初始化參數(shù)來配置.

Paste_Image.png
Paste_Image.png

登錄驗證過濾器:CheckLoginFilter

Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png

屏蔽敏感字過濾器:ContentFilter

Paste_Image.png
Paste_Image.png

上圖在Servlet類中調(diào)用了FilterUtil的filter方法,完成對參數(shù)
字符串的敏感字過濾功能.

從正確與否上分析,沒問題.但是,違背了責任分類的原則.
解決方案:使用過濾器來解決.

Paste_Image.png

上述方式,可以完成敏感字過濾,但是改變了獲取請求參數(shù)的機制.放棄.

Paste_Image.png
Paste_Image.png

我們需要解決的問題是啥:敏感字過濾.
為什么需要做這件事情:在原生的HttpServletRequest中的getParameter方法不支持敏感字過濾.
所以,得出結論,我們需要完成的: 讓請求對象中的getParameter方法擁有敏感字過濾的功能.
目標:在不改變原有類的基礎之上,對某一個方法做增強.
解決方案:
1):繼承方式,覆蓋需要增強的方法.------->子類出現(xiàn)爆炸式增強.
2):組合方式.--->包裝設計模式(裝飾設計模式:decorator)

裝飾設計模式的作用:在不改變原有類的基礎之上,對某一個對象做增強.

IServletRequerst接口: 模擬 ServletRequest接口.
DefaultServletRequestImpl類: 模擬 ServletRequest接口的實現(xiàn)類.
提供String getParameter(String name):并返回一個固定的值.

Paste_Image.png

監(jiān)聽器

1.事件驅動編程:

簡單地說就是你點什么按鈕(即產(chǎn)生什么事件),電腦執(zhí)行什么操作(即調(diào)用什么函數(shù))。

事件驅動編程中核心對象:

1):事件源:誰發(fā)出事件通知,發(fā)出消息;也就是事件主體,比如按鈕;

2):事件名稱:發(fā)出什么樣的通知的名稱,比如鼠標到我頭上了,我被別人點了一下;

3):事件響應函數(shù):誰對這個這個事件感興趣,當這個事件發(fā)生時要執(zhí)行什么樣的操作;

4):事件對象:一般來說,當事件發(fā)生時,會產(chǎn)生一個描述該事件的具體對象,包含事件相關信息。

調(diào)戲事件: 某一天,在大街上,張三看到一個美女,很美,很美,在美女的臉上點擊了一下,美女給了張三一巴掌.

2.Web常見監(jiān)聽器:

監(jiān)聽request,session,ServletContext對象.

1):監(jiān)聽作用域對的創(chuàng)建和銷毀.
ServletRequestListener:
HttpSessionListener:
ServletContextListener:監(jiān)聽服務器的啟動和關閉.
2):監(jiān)聽作用域對象的屬性的添加/刪除/替換操作.(attributeAdded/attributeRemoved/attributeReplaced)
ServletRequestAttributeListener:
HttpSessionAttributeListener:
ServletContextAttributeListener:

開發(fā)監(jiān)聽器:對哪一種事件感興趣,就實現(xiàn)哪一個事件對應的接口.
監(jiān)聽器沒有自己的初始化參數(shù),只能使用全局的初始化參數(shù).

    <context-param>
        <param-name></param-name>
            <param-value></param-value>
    </context-param>
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容