欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java中的Filter使用示例詳解

 更新時(shí)間:2025年05月21日 11:02:41   作者:有夢想的攻城獅  
Filter是JavaWeb開發(fā)中實(shí)現(xiàn)全局邏輯控制的核心工具,通過靈活配置攔截路徑和類型,可高效完成編碼轉(zhuǎn)換、權(quán)限校驗(yàn)、日志記錄等通用功能,這篇文章主要介紹了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)文章

  • 淺談Java并發(fā)中的內(nèi)存模型

    淺談Java并發(fā)中的內(nèi)存模型

    這篇文章主要介紹了Java并發(fā)中的內(nèi)存模型,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-05-05
  • 基于Lucene的Java搜索服務(wù)器Elasticsearch安裝使用教程

    基于Lucene的Java搜索服務(wù)器Elasticsearch安裝使用教程

    Elasticsearch也是用Java開發(fā)的,并作為Apache許可條款下的開放源碼發(fā)布,能夠做到實(shí)時(shí)搜索,且穩(wěn)定、可靠、快速,安裝使用方便,這里我們就來看一下基于Lucene的Java搜索服務(wù)器Elasticsearch安裝使用教程:
    2016-06-06
  • SpringBoot實(shí)現(xiàn)Tomcat集群的會話管理功能

    SpringBoot實(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-12
  • java圖形化界面實(shí)現(xiàn)簡單混合運(yùn)算計(jì)算器的示例代碼

    java圖形化界面實(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-11
  • SpringBoot實(shí)現(xiàn)文章防盜鏈的代碼設(shè)計(jì)

    SpringBoot實(shí)現(xiàn)文章防盜鏈的代碼設(shè)計(jì)

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)文章防盜鏈的代碼設(shè)計(jì),文中通過代碼示例講解的非常詳細(xì),對大家實(shí)現(xiàn)文章防盜鏈功能有一定的幫助,需要的朋友可以參考下
    2024-05-05
  • Mybatis-Plus實(shí)現(xiàn)公共字段自動(dòng)賦值的方法

    Mybatis-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)程與線程的關(guān)系_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    在 Java 語言中,對進(jìn)程和線程的封裝,分別提供了 Process 和 Thread 相關(guān)的一些類。本文首先簡單的介紹如何使用這些類來創(chuàng)建進(jìn)程和線程
    2017-05-05
  • j2ee mybatis注解@Data,@TableName,@TableField使用方式

    j2ee mybatis注解@Data,@TableName,@TableField使用方式

    這篇文章主要介紹了j2ee mybatis注解@Data,@TableName,@TableField使用方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • SpringBoot中定位切點(diǎn)的兩種常用方法

    SpringBoot中定位切點(diǎn)的兩種常用方法

    有時(shí)候,我們使用AOP來進(jìn)行放的增強(qiáng),編寫切面類的時(shí)候,需要定位在哪個(gè)方法上試用該切面進(jìn)行增強(qiáng),本片文章主要講解兩種在SpringBoot中定位切點(diǎn)的方法,感興趣的可以了解一下
    2021-06-06
  • SpringBoot中的文件上傳和異常處理詳解

    SpringBoot中的文件上傳和異常處理詳解

    這篇文章主要介紹了SpringBoot中的文件上傳和異常處理詳解,對于機(jī)器客戶端,它將生成JSON響應(yīng),其中包含錯(cuò)誤,HTTP狀態(tài)和異常消息的詳細(xì)信息,對于瀏覽器客戶端,響應(yīng)一個(gè)"whitelabel"錯(cuò)誤視圖,以HTML格式呈現(xiàn)相同的數(shù)據(jù),需要的朋友可以參考下
    2023-09-09

最新評論