日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java web filter链_filter过滤链:Filter链是如何构建的?

發(fā)布時間:2025/3/8 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java web filter链_filter过滤链:Filter链是如何构建的? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在一個Web應用程序中可以注冊多個Filter程序,每個Filter程序都可以針對某一個URL進行攔截。如果多個Filter程序都對同一個URL進行攔截,那么這些Filter就會組成一個Filter鏈(也叫過濾器鏈)。Filter鏈用FilterChain對象來表示,FilterChain對象中有一個doFilter()方法,該方法作用就是讓Filter鏈上的當前過濾器放行,請求進入下一個Filter,接下來通過一個圖例來描述Filter鏈的攔截過程,如圖1所示。

圖1 Filter鏈

在圖1中,當瀏覽器訪問Web服務器中的資源時需要經過兩個過濾器Filter1和Filter2,首先Filter1會對這個請求進行攔截,在Filter1過濾器中處理好請求后,通過調用Filter1的doFilter()方法將請求傳遞給Filter2,Filter2將用戶請求處理后同樣調用doFilter()方法,最終將請求發(fā)送給目標資源。當Web服務器對這個請求做出響應時,也會被過濾器攔截,這個攔截順序與之前相反,最終將響應結果發(fā)送給客戶端。

為了讓讀者更好的學習Filter鏈,接下來,通過一個案例,分步驟演示如何使用Filter鏈攔截MyServlet的同一個請求,具體如下:

(1)在chapter04工程的cn.itcast.chapter04.filter包中新建MyFilter01和MyFilter02,如例1和2所示。

例1 MyFilter01.java

1 package cn.itcast.chapter04.filter;

2 import java.io.*;

3 import javax.servlet.*;

4 public class MyFilter01 implements Filter {

5 public void destroy() {

6 // 過濾器對象在銷毀時自動調用,釋放資源

7 }

8 public void doFilter(ServletRequest request, ServletResponse response,

9 FilterChain chain) throws IOException, ServletException {

10 // 用于攔截用戶的請求,如果和當前過濾器的攔截路徑匹配,該方法會被調用

11 PrintWriter out=response.getWriter();

12 out.write("Hello MyFilter01");

13 chain.doFilter(request, response);

14 }

15 public void init(FilterConfig fConfig) throws ServletException {

16 // 過濾器對象在初始化時調用,可以配置一些初始化參數

17 }

18 }

例2 MyFilter02.java

1 package cn.itcast.chapter04.filter;

2 import java.io.*;

3 import javax.servlet.Filter;

4 import javax.servlet.*;

5 public class MyFilter02 implements Filter {

6 public void destroy() {

7 // 過濾器對象在銷毀時自動調用,釋放資源

8 }

9 public void doFilter(ServletRequest request, ServletResponse response,

10 FilterChain chain) throws IOException, ServletException {

11 // 用于攔截用戶的請求,如果和當前過濾器的攔截路徑匹配,該方法會被調用

12 PrintWriter out=response.getWriter();

13 out.write("MyFilter02 Before");

14 chain.doFilter(request, response);

15 out.write("MyFilter02 After");

16 }

17 public void init(FilterConfig fConfig) throws ServletException {

18 // 過濾器對象在初始化時調用,可以配置一些初始化參數

19 }

20 }

(2)在web.xml文件中將MyFilter01和MyFilter02注冊在MyServlet前面,具體如下所示:

MyFilter01

cn.itcast.chapter04.filter.MyFilter01

MyFilter01

/MyServlet

MyFilter02

cn.itcast.chapter04.filter.MyFilter02

MyFilter02

/MyServlet

MyServlet

cn.itcast.chapter04.filter.MyServlet

MyServlet

/MyServlet

(3)重新啟動Tomcat服務器,在瀏覽器地址欄中輸入http://localhost:8080/chapter04/MyServlet,此時,瀏覽器窗口中的顯示結果如圖2所示。

從圖2中可以看出,MyServlet首先被MyFilter01攔截了,打印出MyFilter01中的內容,然后被MyFilter02攔截,直到 MyServlet被MyFilter02放行后,瀏覽器才顯示出MySerlvet中的輸出內容。

需要注意的是,Filter鏈中各個Filter的攔截順序與它們在web.xml文件中元素的映射順序一致,由于MyFilter01的元素位于MyFilter02的元素前面,因此用戶的訪問請求首先會被MyFilter01攔截,然后再被MyFilter02攔截。

猜你喜歡:

什么是filter?filter是用來做什么的?

總結

以上是生活随笔為你收集整理的java web filter链_filter过滤链:Filter链是如何构建的?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。