黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

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

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

1、創(chuàng)建過濾器

在 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| 国产午夜精品鲁丝片 | 最近2019免费中文字幕6 | 最新国产一区二区精品久久 | 亚洲区小说区图片区qvod伊 | 天天操天天曰 | 午夜激情在线观看 | 日本久色 | 日韩不卡高清视频 | a级精品九九九大片免费看 a级精品国产片在线观看 | 亚洲免费播放 | 久久线看观看精品香蕉国产 | 欧美亚洲综合网 | 日本一区二区在线视频 | 国产欧美在线一区二区三区 | 亚洲国产成人久久综合碰 | 亚洲综合在线网 | 国产精品亚洲第五区在线 | 欧美黄网站免费观看 | 免费福利午夜影视网 | 国内精品视频在线 | 日批视频在线免费观看 | 亚洲视频免费在线看 | 久久精品国产日本波多麻结衣 | 欧美亚洲免费久久久 | 好吊爽在线播放视频 | 麻豆视频一区二区 | 在线观看视频免费 | 天天干狠狠操 | 欧美视频精品 | 欧美成人www在线观看网页 | 亚洲码和乱人伦中文一区 | 黄色男女视频 | 日本三级香港三级三级人 | 波多野结衣91 | 人人揉 | 香港三级日本三人妇孕妇 | 看全色黄大色大片免费视频 | 日批免费在线观看 | 亚洲 欧美 成人日韩 |