更新時(shí)間:2023-11-10 來(lái)源:黑馬程序員 瀏覽量:
什么是過(guò)濾器鏈呢?所謂過(guò)濾器鏈指的是在一個(gè)web應(yīng)用程序當(dāng)中,可 以配置多個(gè)過(guò)濾器,多個(gè)過(guò)濾器就形成了一個(gè)過(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ò)濾器類(lèi):AbcFilter
2. 在AbcFilter過(guò)濾器中編寫(xiě)放行前和放行后邏輯
3. 配置AbcFilter過(guò)濾器攔截請(qǐng)求路徑為:/*
4. 重啟SpringBoot服務(wù),查看DemoFilter、AbcFilter的執(zhí)行日志
證步驟.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)登錄接口:

通過(guò)控制臺(tái)日志的輸出,大家發(fā)現(xiàn)AbcFilter先執(zhí)行DemoFilter后執(zhí)行,這是為什么呢?
其實(shí)是和過(guò)濾器的類(lèi)名有關(guān)系。以注解方式配置的Filter過(guò)濾器,它的執(zhí)行優(yōu)先級(jí)是按時(shí)過(guò)濾器類(lèi)名的自動(dòng)排序確定的,類(lèi)名排名越靠前,優(yōu)先級(jí)越高。
假如我們想讓DemoFilter先執(zhí)行,怎么辦呢?答案就是修改類(lèi)名。
測(cè)試:修改AbcFilter類(lèi)名為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)求...放行后邏輯");
}
}
1024首播|39歲程序員逆襲記:不被年齡定義,AI浪潮里再迎春天
2025-10-241024程序員節(jié)丨10年同行,致敬用代碼改變世界的你
2025-10-24【AI設(shè)計(jì)】北京143期畢業(yè)僅36天,全員拿下高薪offer!黑馬AI設(shè)計(jì)連續(xù)6期100%高薪就業(yè)
2025-09-19【跨境電商運(yùn)營(yíng)】深圳跨境電商運(yùn)營(yíng)畢業(yè)22個(gè)工作日,就業(yè)率91%+,最高薪資達(dá)13500元
2025-09-19【AI運(yùn)維】鄭州運(yùn)維1期就業(yè)班,畢業(yè)14個(gè)工作日,班級(jí)93%同學(xué)已拿到Offer, 一線均薪資 1W+
2025-09-19【AI鴻蒙開(kāi)發(fā)】上海校區(qū)AI鴻蒙開(kāi)發(fā)4期5期,距離畢業(yè)21天,就業(yè)率91%,平均薪資14046元
2025-09-19