首頁(yè)技術(shù)文章正文

過(guò)濾器鏈指的是什么?怎樣驗(yàn)證過(guò)濾器鏈

更新時(shí)間:2023-11-10 來(lái)源:黑馬程序員 瀏覽量:

什么是過(guò)濾器鏈呢?所謂過(guò)濾器鏈指的是在一個(gè)web應(yīng)用程序當(dāng)中,可 以配置多個(gè)過(guò)濾器,多個(gè)過(guò)濾器就形成了一個(gè)過(guò)濾器鏈。

1699601084533_過(guò)濾器鏈.png

比如:在我們web服務(wù)器當(dāng)中,定義了兩個(gè)過(guò)濾器,這兩個(gè)過(guò)濾器就形成了一個(gè)過(guò)濾器鏈。

而這個(gè)鏈上的過(guò)濾器在執(zhí)行的時(shí)候會(huì)一個(gè)一個(gè)的執(zhí)行,會(huì)先執(zhí)行第一個(gè)Filter,放行之后再來(lái)執(zhí)行第二 個(gè)Filter,如果執(zhí)行到了最后一個(gè)過(guò)濾器放行之后,才會(huì)訪問(wèn)對(duì)應(yīng)的web資源。

訪問(wèn)完web資源之后,按照我們剛才所介紹的過(guò)濾器的執(zhí)行流程,還會(huì)回到過(guò)濾器當(dāng)中來(lái)執(zhí)行過(guò)濾器放

行后的邏輯,而在執(zhí)行放行后的邏輯的時(shí)候,順序是反著的。

先要執(zhí)行過(guò)濾器2放行之后的邏輯,再來(lái)執(zhí)行過(guò)濾器1放行之后的邏輯,最后在給瀏覽器響應(yīng)數(shù)據(jù)。以上就是當(dāng)我們?cè)趙eb應(yīng)用當(dāng)中配置了多個(gè)過(guò)濾器,形成了這樣一個(gè)過(guò)濾器鏈以及過(guò)濾器鏈的執(zhí)行順序。下面我們通過(guò)idea來(lái)驗(yàn)證下過(guò)濾器鏈。

驗(yàn)證步驟:

1. 在filter包下再來(lái)新建一個(gè)Filter過(guò)濾器類:AbcFilter

2. 在AbcFilter過(guò)濾器中編寫(xiě)放行前和放行后邏輯

3. 配置AbcFilter過(guò)濾器攔截請(qǐng)求路徑為:/*

4. 重啟SpringBoot服務(wù),查看DemoFilter、AbcFilter的執(zhí)行日志

1699601556928_驗(yàn)證步驟.png

AbcFilter過(guò)濾器

@WebFilter(urlPatterns = "/*")
public class AbcFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse
response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Abc 攔截到了請(qǐng)求... 放行前邏輯");

        //放行
        chain.doFilter(request,response);

        System.out.println("Abc 攔截到了請(qǐng)求... 放行后邏輯");
    }
}

DemoFilter過(guò)濾器

@WebFilter(urlPatterns = "/*")
public class DemoFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse, FilterChain filterChain) throws
IOException, ServletException {
        System.out.println("DemoFilter 放行前邏輯.....");

        //放行請(qǐng)求
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("DemoFilter 放行后邏輯.....");
    }
}

打開(kāi)瀏覽器訪問(wèn)登錄接口:

1699602022570_登錄接口.png

通過(guò)控制臺(tái)日志的輸出,大家發(fā)現(xiàn)AbcFilter先執(zhí)行DemoFilter后執(zhí)行,這是為什么呢?

其實(shí)是和過(guò)濾器的類名有關(guān)系。以注解方式配置的Filter過(guò)濾器,它的執(zhí)行優(yōu)先級(jí)是按時(shí)過(guò)濾器類名的自動(dòng)排序確定的,類名排名越靠前,優(yōu)先級(jí)越高。

假如我們想讓DemoFilter先執(zhí)行,怎么辦呢?答案就是修改類名。

測(cè)試:修改AbcFilter類名為XbcFilter,運(yùn)行程序查看控制臺(tái)日志

@WebFilter(urlPatterns = "/*")
public class XbcFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse
response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Xbc 攔截到了請(qǐng)求...放行前邏輯");

        //放行
        chain.doFilter(request,response);

        System.out.println("Xbc 攔截到了請(qǐng)求...放行后邏輯");
    }
}

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!