大战熟女丰满人妻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 攔截。

全部教程
主站蜘蛛池模板: 久久综合免费视频 | 奇米影视777在线观看 | 中文字幕人成乱码第一页 | 色鬼综合| 国产伦精品一区二区三区视频小说 | 91精品日本久久久久久牛牛 | 亚洲综合久久综合激情久久 | 国产中文字幕免费 | 激情亚洲| 亚洲91在线 | 欧美日本一区二区 | 伊人国产精品 | 刺激videoschina偷拍 | 91热视频在线| 麻豆精品一区二区三区免费 | 国产一区二区影院 | 五月婷婷综合激情网 | 亚州综合激情另类久久久 | 日韩精品中文字幕久久 | 欧美性性性性性色大片 | 久草在线视频看看 | 精品久久中文字幕 | 华人欧美国产在线精品 | 美日韩在线视频 | 四虎影视最新网址 | 日韩在线欧美在线 | 久久这里精品青草免费 | 欧美日韩亚洲综合久久久 | 一级做a爰片久久毛片唾 | 成人18毛片 | 五月婷婷在线观看 | 色综合久久一区二区三区 | 中国美女牲交一级毛片 | 99热精品6| 女人隐私秘视频黄www免费 | 久久免费毛片 | 天海翼精品久久中文字幕 | 四虎永久在线精品国产免费 | 国产精品久久久久久久久免费 | 91福利刘玥国产在线观看 | 亚洲精品国产第一区二区三区 |