關(guān)于過濾器Filter的介紹和使用詳解
1.簡介
在 Java Web 開發(fā)中,Filter
是一個非常重要的組件,用于在請求到達 Servlet 之前或響應返回客戶端之前對請求和響應進行預處理或后處理。
Filter
可以用來實現(xiàn)多種功能,如日志記錄、權(quán)限檢查、編碼轉(zhuǎn)換、請求頭修改等。就好比機場的層層安檢,對前來的乘客進行檢查過濾,攜帶違規(guī)物品,未買機票等不滿足機場要求的就會被阻止進入。
2.Filter 的工作原理
配置:在 web.xml
文件中或使用注解來配置 Filter
。
- 在
web.xml
中配置
<filter> <!--設(shè)置filter的別名--> <filter-name>LoggingFilter</filter-name> <!--filter的字節(jié)碼路徑--> <filter-class>com.example.LoggingFilter</filter-class> </filter> <filter-mapping> <!--使用filter別名所對應的過濾路徑,可以有多個--> <filter-name>LoggingFilter</filter-name> <!--/*表示對所有路徑進行過濾--> <url-pattern>/*</url-pattern> <!--所要過濾的servlet的別名--> <servlet-name>servlet1</servlet-name> </filter-mapping>
使用注解@WebFilter
,它有如下幾個常用的值:
filterName
: filter的別名相當于標簽urlPatterns
:所要過濾的資源url,相當于標簽ServletNames
:所要過濾的servlet別名,相當于 servletNames
@WebFilter( filterName = "loggingFilter", urlPatterns = {"/servlet1","*.html"}, servletNames = {"servlet1","Servlet2"} )
攔截:
- 當請求到達時,
Filter
會攔截請求,并執(zhí)行預處理邏輯。 - 在請求到達目標資源前所執(zhí)行的一些操作,如檢查用戶是否有權(quán)限訪問記錄、請求和響應的信息
放行:
Filter
可以選擇是否放行請求到目標資源(如 Servlet)。此時會執(zhí)行FilterChain
的doFilter
方法代表放行。FilterChain
表示Filter
鏈,若對于該資源,后續(xù)還有其他Filter
要進行過濾,此時的doFilter
方法就會轉(zhuǎn)而執(zhí)行其他的Filter
;若此時沒有Filter
要進行過濾,那么便會放行,進行目標資源的處理(如,servlet)
后處理:
- 在目標資源(如 Servlet)處理完請求后
Filter
可以對響應進行后處理
3.Filter的生命周期
包括初創(chuàng)建、始化、過濾和銷毀四個階段。
階段 | 對應方法 | 執(zhí)行時機 | 執(zhí)行次數(shù) |
---|---|---|---|
創(chuàng)建對象 | 構(gòu)造器 | web應用啟動時 | 1次 |
初始化方法 | void init(FilterConfig filterConfig) | 構(gòu)造完畢 | 1次 |
過濾請求 | void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) | 每次請求 | 多次 |
銷毀 | default void destroy() | web應用關(guān)閉時 | 1次 |
特別注意的的時Filter
在web應用啟動時就創(chuàng)建了,并且進行初始化,這個過程只會出現(xiàn)一次。
4.Filter的執(zhí)行順序
一個web項目中,可以同時定義多個過濾器,當多個過濾器對同一個資源進行過濾時,工作位置有先后,整體形成一個工作鏈,稱之為過濾器鏈(FilterChain)
- 當使用配置文件進行配置時
- 過濾器鏈中的過濾器的順序由<filter-mapping>標簽的定義順序決定
- 當使用注解的方式進行配置時
- 通常會把全部的過濾器放在一個包下,此時,執(zhí)行順序為類名的字典排序由小到大依次執(zhí)行
5.一個簡單的Filter的示例
案例要求:
當用戶訪問資源時,檢查其是否進行登陸,若未登錄則跳轉(zhuǎn)到登錄頁, 若以登錄則放行
@WebFilter("/*") public class CheckLoginFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //向下轉(zhuǎn)型,實現(xiàn)重定向,獲得session等功能 HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; // 檢查用戶是否已登錄 String user = (String) httpRequest.getSession().getAttribute("username"); if (user == null) { // 用戶未登錄,重定向到登錄頁面 httpResponse.sendRedirect(httpRequest.getContextPath() + "/login"); } else { // 用戶已登錄,放行請求,注意是調(diào)用的FilterChain中的doFilter方法!! chain.doFilter(request, response); } } }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何在Java SpringBoot項目中配置動態(tài)數(shù)據(jù)源你知道嗎
這篇文章主要介紹了SpringBoot如何在運行時動態(tài)添加數(shù)據(jù)源,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2021-09-09

java web監(jiān)聽器統(tǒng)計在線用戶及人數(shù)

Spring源碼如何修改Bean的屬性用到的相關(guān)類