Java web開發--過濾器篇(詳細介紹)

一. web過濾器的介紹

1.過濾器

在生活中,過濾這種我們時常可見;比如水資源的處理,化學藥劑的提取等等。所謂過濾,就是指對某事物的處理進行一定的處理獲取相應的結果的一個過程。它可以總結為下:

過濾源==>過濾規則==>過濾結果
過濾源:需要過濾的東西
過濾規則:對過濾東西的處理
過濾結果:經過過濾后所得的東西

2.web過濾器

過濾器在web中的應用定義

過濾器 是一個服務器端的組件,它可以截取用戶端的請求和響應信息,并對這些信息過濾。

3.web過濾器的工作原理

在沒有過濾器的情況下,用戶的請求可以直接進行訪問服務器web資源

沒有過濾器的情況下

在存在過濾器的情況下,客戶端的請求是不能直接訪問服務器端web資源。
過濾器的具體工作原理:


過濾器的工作原理

過濾器在web程序啟動的時候便會進行加載。用戶發送請求并不是直接到web資源,而是先到過濾器;過濾器判斷我們的請求是否合法、是否符合規則;符合規則后過濾器再將用戶請求發送到web資源;web資源處理完信息響應到過濾器;過濾器再將web資源的響應發送給用戶

3.web過濾器的生命周期

web的生命周期分為四種

過濾器的生命周期
  • 實例化:在web程序啟動的時候,通過web.xml文件中的配置去加載過濾器。只會實例化一次。
  • 初始化:啟動后,會進入到初始化。會調用init()方法加載初始化信息。只執行一次。
  • 過濾:過濾器每次捕獲到請求都會執行過濾方法doFilter()。可執行多次。
  • 銷毀:web容器關閉的時候執行destory()方法銷毀過濾器對象。

4.web過濾器中的方法

  • init():過濾器的初始化方法,web容器創建過濾器實例后將調用這個方法,這個方法可以讀取web.xml文件中過濾器的參數。
  • doFilter():這個方法完成實際的過濾操作,想過濾器的核心方法。當用戶訪問請求與過濾器關聯的URL時,web容器將先調用過濾器的doFilter()方法。FilterChain參數可以調用chain.doFilter()方法,將請求傳給下一個過濾器(或目標資源),或利用轉發、重定向將請求轉發到其他資源。
  • destroy():web容器在銷毀過濾器實例前調用該方法,在這個方法中可以釋放過濾器占用的資源。(大多數情況用不到)

二.過濾器簡單案例

1.創建web項目。并創建一個類實現Filter接口

創建FirstFilter類

2.在web.xml中配置過濾器

  <!-- ……………… -->
  <!-- Filter配置 -->
  <filter>
    <filter-name>Filter名字</filter-name>
    <filter-class>Filter的完整類名稱</filter-class>
    <description>描述信息</description>
    <init-param>
        <param-name>參數名稱</param-name>
        <param-name>參數的值</param-name>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>Filter名字</filter-name>
    <url-pattern>URL</url-pattern>
    <dispatcher></dispatcher>
  </filter-mapping>
  <!-- ……………… -->

注意

  • filter-class:必須是類的全路徑(即包括報名)
  • init-param:初始化參數,可以是零對或者多對
  • url-pattern:當用戶請求的URL和指定的URL路徑相匹配時,將觸發過濾器工作
  • dispatcher:指定過濾器所攔截資源被Servlet容器調用的方式。可以使REQUEST,INCLUDE,FORWARDERROR之一,默認是REQUEST
我的配置

3.在類中寫輸出數據測試

在Filter的實現類中的方法中寫入輸出數據,在index.jsp中前面增加輸出。方便之后看到過濾器執行耳朵順序。

FirstFilter類
index.jsp文件

4.啟動服務器,訪問index.jsp頁面

訪問https://http://127.0.0.1:8080/Filter/后仔細觀察運行結果

在tomcat服務器啟動時執行了構造方法和init()方法
訪問jsp頁面時執行了doFilter方法

所以可以總結Filter實現類中方法的運行順序為:

構造器==> init() ==> doFilter() ==>…………==> destroy()
在執行doFilter()方法時,chain.doFilter()方法將請求傳給了index.jsp,最后才輸出end……doFilter

面試題兩點:

1.過濾器可以更改用戶請求的路徑
2.過濾器不能直接處理用戶請求的數據,也不能直接返回數據

三.過濾器鏈

1.過濾器鏈

過濾器鏈:指針對一個用戶請求,而根據路徑所匹配到的過濾器有多個。這時候用戶請求就會依次通過各個過濾器到達web資源。

2.過濾器鏈的執行順序以及原理

服務器會按照web.xml文件中過濾器定義的先后順序組裝成一條過濾器鏈。通過doFilter()方法依次執行后面的過濾器直至所有過濾器執行完畢后訪問到web資源。

過濾鏈的執行順序及原理
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 本文包括:1、Filter簡介2、Filter是如何實現攔截的?3、Filter開發入門4、Filter的生命周期...
    廖少少閱讀 7,323評論 3 56
  • 僅作為自己學習記錄使用,文章來自: 1、http://blog.csdn.net/csh624366188/art...
    BakerZhang閱讀 1,039評論 1 5
  • 什么是過濾器 過濾器是Servlet的高級特性之一,也別把它想得那么高深,只不過是實現Filter接口的Java類...
    Java3y閱讀 1,201評論 0 9
  • 第一天上班,起的不算晚,但是怕小滿睡醒了也想跟我一起吃飯,就做了個簡易三明治,喝了一杯水當做早餐。 今天我去送小...
    薇薇安_b57f閱讀 285評論 0 0