大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

Servlet教程

Servlet FilterChain過濾器鏈

在一個 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() 方法,最終將請求發送給目標資源。當 Web 服務器對這個請求做出響應時,也會被過濾器攔截,但這個攔截順序與之前相反,最終將響應結果發送給客戶端瀏覽器。

為了便于讀者理解 Filter 鏈的攔截過程以及掌握 Filter 鏈的使用,下面通過案例演示如何使用 Filter 鏈攔截 MyServlet 的同一個請求。

1、創建過濾器

在 filterDemo01 項目的 com.mengma.filter 包中新建兩個過濾器 MyFilter01 和 MyFilter02,如 MyFilter01 和 MyFilter02 所示。

① MyFilter01

package com.mengma.filter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyFilter01 implements Filter {
    public void init(FilterConfig fConfig) throws ServletException {
        // 過濾器對象在初始化時調用,可以配置一些初始化參數
    }
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // 用于攔截用戶的請求,如果和當前過濾器的攔截路徑匹配,則該方法會被調用
        PrintWriter out = response.getWriter();
        out.write("MyFilter01<br/>");
        chain.doFilter(request, response);
    }
    public void destroy() {
        // 過濾器對象在銷毀時自動調用,釋放資源
    }
}

② MyFilter02

package com.mengma.filter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyFilter02 implements Filter {
    public void init(FilterConfig fConfig) throws ServletException {
        // 過濾器對象在初始化時調用,可以配置一些初始化參數
    }
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // 用于攔截用戶的請求,如果和當前過濾器的攔截路徑匹配,則該方法會被調用
        PrintWriter out = response.getWriter();
        out.write("MyFilter02 Before<br/>");
        chain.doFilter(request, response);
        out.write("<br/>MyFilter02 After<br/>");
    }
    public void destroy() {
        // 過濾器對象在銷毀時自動調用,釋放資源
    }
}

2、修改 web.xml

為了防止其他過濾器影響此次 Filter 鏈的演示效果,需要先將 web.xml 文件中的其他過濾器的配置信息注釋掉,然后將 MyFilter01 和 MyFilter02 過濾器的映射信息配置在 MyServlet 配置信息前面,具體如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">
    <filter>
        <filter-name>MyFilter01</filter-name>
        <filter-class>com.mengma.filter.MyFilter01</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>MyFilter01</filter-name>
        <url-pattern>/MyServlet</url-pattern>
    </filter-mapping>
    <filter>
        <filter-name>MyFilter02</filter-name>
        <filter-class>com.mengma.filter.MyFilter02</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>MyFilter02</filter-name>
        <url-pattern>/MyServlet</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.mengma.filter.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/MyServlet</url-pattern>
    </servlet-mapping>
</web-app>

3、運行項目并查看結果

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

圖 2 運行結果

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

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

全部教程
主站蜘蛛池模板: 亚洲一二区视频 | 91成人影院未满十八勿入 | 视频二区中文字幕 | 亚洲 欧美 视频 | 一级一毛片 | 日韩亚洲欧美一区二区三区 | 国产日韩精品欧美在线ccc | 国产精品无码久久综合网 | 香蕉视频一区二区三区 | 91视频欧美| 欧美xxx网站 | 一本久久精品一区二区 | 久久免费视频3 | 亚洲欧美综合一区二区三区四区 | 欧美专区综合 | 国产福利精品在线 | 亚洲毛片网站 | 狠狠色噜噜狠狠狠合久 | 亚洲区视频在线观看 | 免费国产精成人品 | 日韩日b | 亚洲精品欧洲一区二区三区 | 波多野吉衣一区二区三区四区 | 日本综合 | 美女视频黄视大全视频免费网址 | 日韩一区二区三 | 中文字幕五月天 | 91福利精品老师国产自产在线 | 国产精品福利影院 | 国产精品18 | 成人午夜亚洲影视在线观看 | 久久香蕉国产线看观看99 | 色偷偷亚洲第一综合 | 五月婷婷激情五月 | 天天射天天草 | 免费鲁丝片一级观看 | 久久er国产精品免费观看1 | 国产精品尹人在线观看免费 | 成年人视频在线免费 | 四虎在线看 | 中文在线日韩 |