更新時(shí)間:2023-11-10 來(lái)源:黑馬程序員 瀏覽量:
什么是過(guò)濾器鏈呢?所謂過(guò)濾器鏈指的是在一個(gè)web應(yīng)用程序當(dāng)中,可 以配置多個(gè)過(guò)濾器,多個(gè)過(guò)濾器就形成了一個(gè)過(guò)濾器鏈。
比如:在我們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í)行日志
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)登錄接口:
通過(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)求...放行后邏輯"); } }