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