java中的Filter使用示例詳解
Filter(過(guò)濾器)是 Java Web 開(kāi)發(fā)的核心組件之一,用于在請(qǐng)求到達(dá) Servlet 或響應(yīng)返回客戶端之前進(jìn)行攔截和處理。以下是其核心功能、使用方法和實(shí)際場(chǎng)景的詳細(xì)解析:
一、Filter 的作用與原理
核心作用
Filter 充當(dāng)請(qǐng)求與響應(yīng)之間的“中間層”,主要功能包括:
- 請(qǐng)求預(yù)處理:如統(tǒng)一編碼設(shè)置、敏感詞過(guò)濾、權(quán)限校驗(yàn)。
- 響應(yīng)后處理:如壓縮響應(yīng)內(nèi)容、添加安全頭。
- 資源攔截控制:根據(jù)規(guī)則限制對(duì)特定資源的訪問(wèn)(如登錄校驗(yàn))。
工作原理
- 過(guò)濾器鏈:多個(gè) Filter 按配置順序形成鏈?zhǔn)教幚恚?qǐng)求依次通過(guò)每個(gè) Filter,響應(yīng)則反向傳遞。
- 攔截時(shí)機(jī):可配置攔截請(qǐng)求類型(如
REQUEST、FORWARD)。
二、Filter 的創(chuàng)建與配置
實(shí)現(xiàn) Filter 接口
需實(shí)現(xiàn) javax.servlet.Filter 接口,并重寫(xiě)三個(gè)生命周期方法:
public class AuthFilter implements Filter {
@Override
public void init(FilterConfig config) { /* 初始化資源 */ }
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
// 請(qǐng)求處理邏輯(如權(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> <!-- 攔截請(qǐng)求類型 -->
</filter-mapping>注解配置(推薦):
@WebFilter(urlPatterns = {"/secure/*"}, initParams = {@WebInitParam(name = "param", value = "value")})
public class AuthFilter implements Filter { /* ... */ }三、Filter 的生命周期
init() 方法
- 觸發(fā)時(shí)機(jī):服務(wù)器啟動(dòng)時(shí)執(zhí)行一次,用于加載初始化參數(shù)或資源(如數(shù)據(jù)庫(kù)連接)。
- 參數(shù):
FilterConfig可獲取配置信息(如<init-param>)。
doFilter() 方法
- 核心邏輯:每次請(qǐng)求符合攔截路徑時(shí)執(zhí)行,需調(diào)用
chain.doFilter()放行。 - 攔截與修改:可在此修改請(qǐng)求/響應(yīng)對(duì)象(如重寫(xiě)
HttpServletRequestWrapper)。
destroy() 方法
- 觸發(fā)時(shí)機(jī):服務(wù)器關(guān)閉時(shí)執(zhí)行,用于釋放資源(如關(guān)閉線程池)。
四、攔截路徑配置詳解
URL 匹配模式
• 精確匹配:/login 僅攔截該路徑請(qǐng)求。
• 目錄匹配:/admin/* 攔截 /admin 下所有子路徑。
• 后綴匹配:*.jsp 攔截所有 JSP 請(qǐng)求。
• 全局匹配:/* 攔截所有請(qǐng)求。
攔截類型(Dispatcher)
• REQUEST:直接請(qǐng)求(默認(rèn))。
• FORWARD:攔截轉(zhuǎn)發(fā)請(qǐng)求(如 request.getRequestDispatcher().forward())。
• ERROR:攔截錯(cuò)誤頁(yè)面跳轉(zhuǎn)。
五、多 Filter 執(zhí)行順序
配置順序規(guī)則
• XML 配置:按 <filter-mapping> 定義的順序執(zhí)行。
• 注解配置:默認(rèn)按類名字典序執(zhí)行(不同容器可能有差異)。
示例流程
請(qǐng)求 → Filter1 → Filter2 → Servlet → Filter2 → Filter1 → 響應(yīng)
六、典型應(yīng)用場(chǎ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("請(qǐng)求耗時(shí):" + duration + "ms");
}
}七、注意事項(xiàng)
線程安全
Filter 實(shí)例為單例,避免在類中定義成員變量(若需共享數(shù)據(jù),使用 ThreadLocal)。
性能優(yōu)化
• 減少 doFilter() 中的阻塞操作(如遠(yuǎn)程調(diào)用),必要時(shí)結(jié)合異步處理。
• 合理設(shè)置攔截路徑,避免全局?jǐn)r截導(dǎo)致性能下降。
異常處理
在 doFilter() 中捕獲異常,防止因未處理異常導(dǎo)致過(guò)濾器鏈中斷。
總結(jié)
Filter 是 Java Web 開(kāi)發(fā)中實(shí)現(xiàn)全局邏輯控制的核心工具,通過(guò)靈活配置攔截路徑和類型,可高效完成編碼轉(zhuǎn)換、權(quán)限校驗(yàn)、日志記錄等通用功能。合理設(shè)計(jì)過(guò)濾器鏈和執(zhí)行順序,能顯著提升應(yīng)用的可維護(hù)性和安全性。
到此這篇關(guān)于java中的Filter使用示例詳解的文章就介紹到這了,更多相關(guān)java Filter使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Lucene的Java搜索服務(wù)器Elasticsearch安裝使用教程
Elasticsearch也是用Java開(kāi)發(fā)的,并作為Apache許可條款下的開(kāi)放源碼發(fā)布,能夠做到實(shí)時(shí)搜索,且穩(wěn)定、可靠、快速,安裝使用方便,這里我們就來(lái)看一下基于Lucene的Java搜索服務(wù)器Elasticsearch安裝使用教程:2016-06-06
SpringBoot實(shí)現(xiàn)Tomcat集群的會(huì)話管理功能
在使用 Tomcat 集群時(shí),由于每個(gè) Tomcat 實(shí)例的 Session 存儲(chǔ)是獨(dú)立的,導(dǎo)致無(wú)法實(shí)現(xiàn) Session 的共享,這可能影響到用戶跨節(jié)點(diǎn)的訪問(wèn),為了實(shí)現(xiàn)跨 Tomcat 實(shí)例共享 Session,可以使用 Spring Session 配合 Redis 進(jìn)行集中式會(huì)話管理,需要的朋友可以參考下2024-12-12
java圖形化界面實(shí)現(xiàn)簡(jiǎn)單混合運(yùn)算計(jì)算器的示例代碼
這篇文章主要介紹了java圖形化界面實(shí)現(xiàn)簡(jiǎn)單混合運(yùn)算計(jì)算器的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
SpringBoot實(shí)現(xiàn)文章防盜鏈的代碼設(shè)計(jì)
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)文章防盜鏈的代碼設(shè)計(jì),文中通過(guò)代碼示例講解的非常詳細(xì),對(duì)大家實(shí)現(xiàn)文章防盜鏈功能有一定的幫助,需要的朋友可以參考下2024-05-05
Mybatis-Plus實(shí)現(xiàn)公共字段自動(dòng)賦值的方法
這篇文章主要介紹了Mybatis-Plus實(shí)現(xiàn)公共字段自動(dòng)賦值的方法,涉及到通用字段自動(dòng)填充的最佳實(shí)踐總結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
簡(jiǎn)述Java中進(jìn)程與線程的關(guān)系_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
在 Java 語(yǔ)言中,對(duì)進(jìn)程和線程的封裝,分別提供了 Process 和 Thread 相關(guān)的一些類。本文首先簡(jiǎn)單的介紹如何使用這些類來(lái)創(chuàng)建進(jìn)程和線程2017-05-05
j2ee mybatis注解@Data,@TableName,@TableField使用方式
這篇文章主要介紹了j2ee mybatis注解@Data,@TableName,@TableField使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04

