java中的Filter使用示例詳解
Filter(過濾器)是 Java Web 開發(fā)的核心組件之一,用于在請求到達 Servlet 或響應(yīng)返回客戶端之前進行攔截和處理。以下是其核心功能、使用方法和實際場景的詳細解析:
一、Filter 的作用與原理
核心作用
Filter 充當(dāng)請求與響應(yīng)之間的“中間層”,主要功能包括:
- 請求預(yù)處理:如統(tǒng)一編碼設(shè)置、敏感詞過濾、權(quán)限校驗。
- 響應(yīng)后處理:如壓縮響應(yīng)內(nèi)容、添加安全頭。
- 資源攔截控制:根據(jù)規(guī)則限制對特定資源的訪問(如登錄校驗)。
工作原理
- 過濾器鏈:多個 Filter 按配置順序形成鏈式處理,請求依次通過每個 Filter,響應(yīng)則反向傳遞。
- 攔截時機:可配置攔截請求類型(如
REQUEST、FORWARD)。
二、Filter 的創(chuàng)建與配置
實現(xiàn) Filter 接口
需實現(xiàn) javax.servlet.Filter 接口,并重寫三個生命周期方法:
public class AuthFilter implements Filter {
@Override
public void init(FilterConfig config) { /* 初始化資源 */ }
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
// 請求處理邏輯(如權(quán)限檢查)
chain.doFilter(req, res); // 放行
// 響應(yīng)處理邏輯(如日志記錄)
}
@Override
public void destroy() { /* 釋放資源 */ }
}配置方式
XML 配置(web.xml):
<filter>
<filter-name>AuthFilter</filter-name>
<filter-class>com.example.AuthFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>/secure/*</url-pattern>
<dispatcher>REQUEST</dispatcher> <!-- 攔截請求類型 -->
</filter-mapping>注解配置(推薦):
@WebFilter(urlPatterns = {"/secure/*"}, initParams = {@WebInitParam(name = "param", value = "value")})
public class AuthFilter implements Filter { /* ... */ }三、Filter 的生命周期
init() 方法
- 觸發(fā)時機:服務(wù)器啟動時執(zhí)行一次,用于加載初始化參數(shù)或資源(如數(shù)據(jù)庫連接)。
- 參數(shù):
FilterConfig可獲取配置信息(如<init-param>)。
doFilter() 方法
- 核心邏輯:每次請求符合攔截路徑時執(zhí)行,需調(diào)用
chain.doFilter()放行。 - 攔截與修改:可在此修改請求/響應(yīng)對象(如重寫
HttpServletRequestWrapper)。
destroy() 方法
- 觸發(fā)時機:服務(wù)器關(guān)閉時執(zhí)行,用于釋放資源(如關(guān)閉線程池)。
四、攔截路徑配置詳解
URL 匹配模式
• 精確匹配:/login 僅攔截該路徑請求。
• 目錄匹配:/admin/* 攔截 /admin 下所有子路徑。
• 后綴匹配:*.jsp 攔截所有 JSP 請求。
• 全局匹配:/* 攔截所有請求。
攔截類型(Dispatcher)
• REQUEST:直接請求(默認)。
• FORWARD:攔截轉(zhuǎn)發(fā)請求(如 request.getRequestDispatcher().forward())。
• ERROR:攔截錯誤頁面跳轉(zhuǎn)。
五、多 Filter 執(zhí)行順序
配置順序規(guī)則
• XML 配置:按 <filter-mapping> 定義的順序執(zhí)行。
• 注解配置:默認按類名字典序執(zhí)行(不同容器可能有差異)。
示例流程
請求 → Filter1 → Filter2 → Servlet → Filter2 → Filter1 → 響應(yīng)
六、典型應(yīng)用場景
統(tǒng)一編碼設(shè)置
public class EncodingFilter implements Filter {
@Override
public void doFilter(...) {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
}權(quán)限控制
public class LoginFilter implements Filter {
@Override
public void doFilter(...) {
HttpSession session = ((HttpServletRequest) request).getSession();
if (session.getAttribute("user") == null) {
((HttpServletResponse) response).sendRedirect("/login");
} else {
chain.doFilter(request, response);
}
}
}日志記錄與性能監(jiān)控
public class LogFilter implements Filter {
@Override
public void doFilter(...) {
long startTime = System.currentTimeMillis();
chain.doFilter(request, response);
long duration = System.currentTimeMillis() - startTime;
System.out.println("請求耗時:" + duration + "ms");
}
}七、注意事項
線程安全
Filter 實例為單例,避免在類中定義成員變量(若需共享數(shù)據(jù),使用 ThreadLocal)。
性能優(yōu)化
• 減少 doFilter() 中的阻塞操作(如遠程調(diào)用),必要時結(jié)合異步處理。
• 合理設(shè)置攔截路徑,避免全局攔截導(dǎo)致性能下降。
異常處理
在 doFilter() 中捕獲異常,防止因未處理異常導(dǎo)致過濾器鏈中斷。
總結(jié)
Filter 是 Java Web 開發(fā)中實現(xiàn)全局邏輯控制的核心工具,通過靈活配置攔截路徑和類型,可高效完成編碼轉(zhuǎn)換、權(quán)限校驗、日志記錄等通用功能。合理設(shè)計過濾器鏈和執(zhí)行順序,能顯著提升應(yīng)用的可維護性和安全性。
到此這篇關(guān)于java中的Filter使用示例詳解的文章就介紹到這了,更多相關(guān)java Filter使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springcloud 服務(wù)降級的實現(xiàn)方法
這篇文章主要介紹了springcloud 服務(wù)降級的實現(xiàn)方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
springboot實現(xiàn)string轉(zhuǎn)json json里面帶數(shù)組
這篇文章主要介紹了springboot實現(xiàn)string轉(zhuǎn)json json里面帶數(shù)組,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
Java并發(fā)編程深入理解之Synchronized的使用及底層原理詳解 上
在并發(fā)編程中存在線程安全問題,主要原因有:1.存在共享數(shù)據(jù) 2.多線程共同操作共享數(shù)據(jù)。關(guān)鍵字synchronized可以保證在同一時刻,只有一個線程可以執(zhí)行某個方法或某個代碼塊,同時synchronized可以保證一個線程的變化可見(可見性),即可以代替volatile2021-09-09
Spring Boot LocalDateTime格式化處理的示例詳解
這篇文章主要介紹了Spring Boot LocalDateTime格式化處理的示例詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10
Java獲取年月日(格式:xxxx年xx月xx日)的方法詳解
在開發(fā)應(yīng)用程序時,經(jīng)常需要獲取當(dāng)前的年、月、日,并以特定格式進行展示或處理,本文將介紹如何獲取年月日,并將其格式化為“xxxx年xx月xx日”的形式,幫助你在應(yīng)用程序中處理日期信息,需要的朋友可以參考下2023-10-10
關(guān)于Java的HashMap多線程并發(fā)問題分析
HashMap是采用鏈表解決Hash沖突,因為是鏈表結(jié)構(gòu),那么就很容易形成閉合的鏈路,這樣在循環(huán)的時候只要有線程對這個HashMap進行g(shù)et操作就會產(chǎn)生死循環(huán),本文針對這個問題進行分析,需要的朋友可以參考下2023-05-05

