Web基礎瞭解版10-Filter-Listener

来源:https://www.cnblogs.com/Open-ing/archive/2019/12/31/12126415.html
-Advertisement-
Play Games

Filter 對於WEB應用來說,過濾器是一個駐留在伺服器中的WEB組件,他可以截取客戶端和WEB資源之間的請求和響應信息。 在一個WEB應用中可以部署多個過濾器,多個過濾器就組成了一個過濾器鏈,請求和響應必須在經過多個過濾器後才能到達目標 當配置多個Filter以後就有一個執行順序的問題,實際執行 ...


Filter

對於WEB應用來說,過濾器是一個駐留在伺服器中的WEB組件,他可以截取客戶端和WEB資源之間的請求和響應信息。

在一個WEB應用中可以部署多個過濾器,多個過濾器就組成了一個過濾器鏈,請求和響應必須在經過多個過濾器後才能到達目標

當配置多個Filter以後就有一個執行順序的問題,實際執行順序是按照在web.xml文件中servlet-mapping的順序決定的,如果順序越靠前越先被調用。

Filter介面

  • Filter是一個介面。

  • Filter是Java Web三大組件之一。(JavaWeb三大組件分別是:Servlet小程式、Filter過濾器、Listener監聽器)

  • 作用:1.檢查用戶訪問許可權

                2.設置請求響應編碼,解決亂碼問題

主要API

Filter

  • init(FilterConfig)方法用於初始化Filter

  • doFilter(ServletRequest,ServletResponse,FilterChain)作用和service()方法類似,是過濾請求和響應的主要方法。

  • destroy()用於在Filter對象被銷毀前做一些收尾工作。如:釋放資源等。

FilterConfig

FilterConfig對象在伺服器調用init()方法時傳遞進來。

  • getFilterName() 獲取Filter的名字

  • getServletContext() 獲取ServletContext對象(即application)

  • getInitParameter(String) 獲取Filter的初始化參數

  • getInitParameterNames() 獲取所有初始化參數的名字

FilterChain

FilterChain對象是在doFilter()方法被調用時作為參數傳遞進來的。

  • doFilter(ServletRequest,ServletResponse)方法用於調用Filter鏈上的下一個過濾器,如果當前過濾器為最後一個過濾器則將請求發送到目標資源。

web.xml文件中的Filter配置

<filter-mapping>
    <!-- Filter的名字 -->
    <filter-name>Filter1</filter-name>
    <!-- Filter1的過濾地址,表示過濾http://127.0.0.1:8080/day17/admin/user.jsp-->
    <url-pattern>/admin/user.jsp</url-pattern>
</filter-mapping>

 

除此之外在filter-mapping還有一個子標簽dispatcher,該標簽用來指定需要Filter處理的請求類型

<!-- 用戶直接訪問資源時,會調用Filter -->
<dispatcher>REQUEST</dispatcher>

<!-- 通過轉發訪問時,會調用Filter -->
<dispatcher>FORWARD</dispatcher>

<!-- 通過動態包含獲取時,會調用Filter -->
<dispatcher>INCLUDE</dispatcher>

<!-- 當通過異常處理訪問頁面時,會調用Filter -->
<dispatcher>ERROR</dispatcher>

 

這四種情況可以設置一個,也可以同時設置多個,如果不設置那麼預設為REQUEST

Filter生命周期

  1. 先執行Filter的構造方法

  2. 然後執行Filter的init()方法,對象創建後,馬上就被調用,對Filter做一些初始化操作

  3. 執行Filter的doFilter()方法,每次訪問目標資源,只要匹配過濾的地址,就會調用。

  4. 執行Filter的destroy()方法,伺服器停止時調用,用來釋放資源。

FilterConfig類

作用:

  • 獲取Filter在web.xml文件中配置的名稱

  • 獲取Filter在web.xml文件中配置的初始化參數

  • 通過FilterConfig類獲取ServletContext對象實例

    // 獲取Filter的名稱
    String filterName = filterConfig.getFilterName();// 獲取初始化參數。username的值
    String username = filterConfig.getInitParameter("username");// 獲取ServletContext的對象實例 
    ServletContext ctx = filterConfig.getServletContext();

     

FilterChain過濾器鏈

  • FilterChain是整個Filter過濾器的調用者。Filter與Filter之間的傳遞,或者Filter與請求資源之間的傳遞都靠FilterChain.doFilter方法。

  • 一般Filter.doFilter中的代碼分為三段:

    • 第一段是FilterChain.doFilter之前的代碼。一般用來做請求的攔截,檢查用戶訪問的許可權,訪問日記的記錄。參數編碼的設置等等操作。

    • 第二段是FilterChain.doFilter方法。此方法可以將代碼的執行傳遞到下一個Filter中。或者是傳遞到用戶最終訪問的資源中。

    • 第三段是FilterChain.doFilter之後的代碼。主要用過做一些日誌操作。我們很少會在第三段中做太多複雜的操作。

  • 在每一個Filter類的doFilter方法中,一定要調用chain.doFilter方法,除非你想要阻止用戶繼續往下麵訪問。否則一定要調用FilterChain的doFilter方法。

Filter的攔截路徑

主要有以下兩種

  • 第一種:通過filter-mapping的url-pattern來配置(與Servlet的url-pattern的規則相同)

    • 精確匹配:/路徑/資源名

      比如:/index.html、/hello/index.jsp 、 /client/LoginServlet 等,只有在請求地址完全一樣時才會調用Filter

    • 目錄匹配:/路徑名/*

      比如1:/abc/* 表示可以攔截abc目錄下的所有資源,甚至是abc目錄下的其他目錄。

      比如2:/* 表示只要訪問項目根目錄下的資源就會調用Filter

    • 尾碼名匹配:*.尾碼名

      比如:*.jsp 表示攔截所有尾碼為jsp文件資源

  • 第二種:通過filter-mapping中的servlet-name來指定要過濾的Servlet

在Filter的filter-mapping中增加了一個servlet-name標簽,將該標簽的值設置成Servlet的名字,在訪問Servlet時就會調用該過濾器過濾請求。
  <filter-mapping>
    <filter-name>HelloFilter</filter-name>
    <servlet-name>HelloServlet</servlet-name>
  </filter-mapping>

 

Listener

Listener用於監聽JavaWeb程式中的事件,當事件被觸發時,監聽器中的指定方法將會被調用。

監聽對象的創建與銷毀

  • ServletContextListener

    • 作用:監聽ServletContext對象的創建與銷毀

    • 方法:

      public void contextInitialized ( ServletContextEvent sce ):ServletContext創建時調用

      public void contextDestroyed ( ServletContextEvent sce ):ServletContext銷毀時調用

    • ServletContextEvent對象

      • 作用:public ServletContext getServletContext ():獲取ServletContext對象

  • HttpSessionListener

    • 作用:監聽HttpSession對象的創建與銷毀

    • 方法:

      • public void sessionCreated ( HttpSessionEvent se ):HttpSession對象創建時調用

      • public void sessionDestroyed ( HttpSessionEvent se ):HttpSession對象銷毀時調用

    • HttpSessionEvent對象

      • 作用:public HttpSession getSession ():獲取當前HttpSession對象

  • ServletRequestListener

    • 作用:監聽ServletRequest對象的創建與銷毀

    • 方法:

      • public void requestInitialized ( ServletRequestEvent sre ):ServletRequest對象創建時調用

      • public void requestDestroyed ( ServletRequestEvent sre ):ServletRequest對象銷毀時調用

    • ServletRequestEvent對象

      • 作用:

        public ServletRequest getServletRequest ():獲取當前的ServletRequest對象。

        public ServletContext getServletContext ():獲取當前項目的ServletContext對象。

三種創建與銷毀的監聽器使用起來基本一致。

在web.xml文件中註冊監聽器

<listener>
<listener-class>com.web.listener.MyServletContextListener</listener-class>
</listener>

 

監聽對象的屬性變化

  • ServletContextAttributeListener

    • 作用:監聽ServletContext中屬性的創建、修改和銷毀

    • 方法:

      public void attributeAdded(ServletContextAttributeEvent scab):向ServletContext中添加屬性時調用

      public void attributeRemoved(ServletContextAttributeEvent scab):從ServletContext中移除屬性時調用

      public void attributeReplaced(ServletContextAttributeEvent scab):當ServletContext中的屬性被修改時調用

    • ServletContextAttributeEvent對象

      • 作用:

        public String getName() :獲取修改或添加的屬性名

        public Object getValue():獲取被修改或添加的屬性值

        public ServletContext getServletContext ():獲取當前WEB應用的ServletContext對象

  • HttpSessionAttributeListener

    • 作用:監聽HttpSession中屬性的創建、修改和銷毀

    • 方法:

      public void attributeAdded ( HttpSessionBindingEvent se ):向HttpSession中添加屬性時調用

      public void attributeRemoved(HttpSessionBindingEvent se):從HttpSession中移除屬性時調用

      public void attributeReplaced(HttpSessionBindingEvent se):當HttpSession中的屬性被修改時調用

    • HttpSessionBindingEvent對象

      • 作用:

        public String getName() :獲取修改或添加的屬性名

        public Object getValue():獲取被修改或添加的屬性值

        public HttpSession getSession ():獲取當前的HttpSession對象

  • ServletRequestAttributeListener

    • 作用:監聽ServletRequest中屬性的創建、修改和銷毀

    • 方法:

      public void attributeAdded (ServletRequestAttributeEvent srae ):向ServletRequest中添加屬性時調用

      public void attributeRemoved(ServletRequestAttributeEvent srae):從ServletRequest中移除屬性時調用

      public void attributeReplaced(ServletRequestAttributeEvent srae):當ServletRequest中的屬性被修改時調用

    • ServletRequestAttributeEvent對象

      • 作用:

        public String getName():獲取修改或添加的屬性名

        public Object getValue():獲取被修改或添加的屬性值

        public ServletRequest getServletRequest () :獲取當前的ServletRequest對象

監聽Session內的對象

  • HttpSessionBindingListener

    • 作用:監聽某個對象在session域中的創建與移除。

    • 方法:

      public void valueBound(HttpSessionBindingEvent event):該類的實例被放到Session域中時調用

      public void valueUnbound(HttpSessionBindingEvent event):該類的實例從Session中移除時調用

    • HttpSessionBindingEvent對象

      • 作用:

        public HttpSession getSession ():獲取HttpSession對象

        public String getName():獲取操作的屬性名

        public Object getValue():獲取操作的屬性值

  • 使用:要監聽哪一個類,直接使該類實現HttpSessionBindingListener介面即可。

  • HttpSessionActivationListener

    • 作用:監聽某個對象在session中的序列化與反序列化。

    • 方法:

      public void sessionWillPassivate(HttpSessionEvent se):該類實例和Session一起鈍化到硬碟時調用

      public void sessionDidActivate(HttpSessionEvent se):該類實例和Session一起活化到記憶體時調用

    • HttpSessionEvent對象

      • 作用:

        public HttpSession getSession ():獲取HttpSession對象

  • 使用:要監聽哪一個類,直接使該類實現HttpSessionActivationListener介面即可。

註意:為被監聽類對象可以正常序列化到硬碟上,還需要讓該類實現java.io.Serializable介面

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 資料庫瞭解 概念 資料庫就是一種特殊的文件,其中存儲著需要的數據 一個資料庫可以有多張表 MySQL是一種關係型資料庫 具有關聯性數據的就是關係型資料庫 MySQL是一種軟體可以用來創建mysql資料庫 MySQL也是C/S構架(底層TCP) MySQL客戶端 客戶端連接服務端使用TCP協議連接 使 ...
  • 本文源碼: "GitHub·點這裡" || "GitEE·點這裡" 一、系統封裝函數 MySQL 有很多內置的函數,可以快速解決開發中的一些業務需求,大概包括流程式控制制函數,數值型函數、字元串型函數、日期時間函數、聚合函數等。以下列出了這些分類中常用的函數。 1、控制流程函數 case...when ...
  • 最近學習c++,看到很多常用的例子,比如文件切割,切割後尾碼可以自定義,別人就無法從錶面的一個文件看出是什麼,也無法查看到原文件信息,只有合併後才能識別這廬山真面目 實現也比較粗暴,首先在應用層定義好兩個方法 先是文件分割,寫一個測試方法,去調用定義好的 fileSplit ,傳入生成的路徑,自定義 ...
  • 之前學習了3.Android-ADT之helloworld項目結構介紹後,本章便來寫個簡單的電話撥號器程式. 實現的步驟如下所示: 1.創建項目 2.寫layout/activity_main.xml佈局文件(畫ui),實現顯示效果 3.寫MainActivity.java代碼,實現具體邏輯功能 4 ...
  • [1]概述 [2]git 配置 [3]git 基礎操作 [4]git 查看 [5]git 版本切換 [6]git 分支管理 [7]git 遠程倉庫與分支 [8]git 其他操作 [9]註意事項 [10]git 常用命令 ...
  • 案例:隨機小方塊 產生隨機數對象,自調用構造函數 產生小方塊對象,自調用構造函數,裡面存放: 食物的構造函數 給原型對象添加方法:初始化小方塊的顯示的效果及位置 顯示地圖上 給原型對象添加方法,產生隨機位置 實例化對象 <!DOCTYPE html> <html lang="en"> <head> ...
  • 本文將簡單介紹一下我所收集到的React Native應用優化方法,希望對你有所啟發。很多方法也是適用React web應用的。 ...
  • 註意:uin=<%#Eval("QQ")%>,這裡動態綁定qq號,也可以直接填寫qq,如果動態綁定qq號,綁定後的html代碼添加<p></p>標簽. 這時,點擊會彈出版本不支持,如下圖 然後我下載了最新版本,這時,點擊還是會彈出上圖的同樣問題。 最終查看html源代碼,發現uin=qq號,發現多了 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...