大战熟女丰满人妻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| 日本不卡高清视频 | 麻豆传煤一区免费入 | 久久免费99精品久久久久久 | 亚州免费一级毛片 | 狠狠狠色丁香婷婷综合久久88 | 精品黑人一区二区三区 | 爱爱免费网址 | 久操视频网 | 国外成人免费视频 | 日本一级在线观看 | 国产成人一区二区三区 | 欧美日韩中字 | 在线观看日本人免费视频色 | 免费精品久久久久久中文字幕 | 国语一区 | 国产成人精品综合 | 国产视频欧美 | 亚洲一片 | 国内精品视频一区二区八戒 | 亚洲一区二区三区在线播放 | 日本欧美久久久久免费播放网 | 91社区在线观看精品 | 在线欧美69v免费观看视频 | 国产精品色婷婷在线观看 | 久热这里只精品99国产6_99 | 日本草草影院 | 成人免费视频网站 | 久久这里只有精品免费视频 | 精品综合久久久久久蜜月 | 欧美e片成 人 在线播放乱妇 | 黑人特黄aa毛片 | 午夜欧美精品久久久久久久 | 欧美男女性生活视频 | 免费观看视频成人国产 | 久久66热这里只会有精品 | 视色tv | 人人爰人人人人人鲁 | a级做人爱免费播放 | 国产一级做a爱免费视频 |