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

全部教程
主站蜘蛛池模板: www.久久精品 | 久久福利青草免费精品 | 在线看的成人性视频 | 色九九亚洲偷偷动态图 | 不卡中文一二三区 | 免费黄色一级网站 | 91精品国产综合久久婷婷 | 国产亚洲午夜精品a一区二区 | 丁香婷婷影音先锋5566 | 免费国内精品久久久久影院 | 亚洲综合春色另类久久 | 亚洲图片综合网 | 一级日本特黄毛片视频 | 高清一级毛片免免费看 | 中文字幕精品一区 | 亚洲十欧美十日韩十国产 | 国产精品久久久久久久久久98 | 成年女人视频在线观看免费 | 欧美成人免费高清网站 | 91资源在线 | 欧美乱插 | 偷自拍视频区综合视频区 | 亚洲图区欧美 | 久久狠狠婷婷丁香香蕉 | 色五婷婷| 大乳女做爰中文字幕 | 在线高清免费爱做网 | 裸身裸乳免费视频网站 | 亚洲日韩欧洲无码av夜夜摸 | aa毛片免费全部播放完整 | 成人久久久久久 | 波多野结衣中文无毒不卡 | 天天干天天插天天射 | 色久阁 | 日日添天天做天天爱 | 国产精品成人免费 | 日本中文一二区有码在线观看 | 久久中文在线 | 亚洲综合国产一区在线 | 一区二区三区免费视频 www | 在线播放91 |