最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中的Filter使用示例詳解

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

  • Mybatis的xml文件時間范圍條件查詢方式

    Mybatis的xml文件時間范圍條件查詢方式

    這篇文章主要介紹了Mybatis的xml文件時間范圍條件查詢方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Mybatis枚舉類型轉(zhuǎn)換源碼分析

    Mybatis枚舉類型轉(zhuǎn)換源碼分析

    在Mybatis的TypeHandlerRegistry中,添加了常用的類轉(zhuǎn)換器,其中默認的枚舉類型轉(zhuǎn)換器是EnumTypeHandler,這篇文章主要介紹了Mybatis枚舉類型轉(zhuǎn)換源碼分析,需要的朋友可以參考下
    2024-05-05
  • springcloud 服務(wù)降級的實現(xià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ù)組

    這篇文章主要介紹了springboot實現(xiàn)string轉(zhuǎn)json json里面帶數(shù)組,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • druid的borrow行為方法源碼解析

    druid的borrow行為方法源碼解析

    這篇文章主要為大家介紹了druid的borrow行為方法源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Java并發(fā)編程深入理解之Synchronized的使用及底層原理詳解 上

    Java并發(fā)編程深入理解之Synchronized的使用及底層原理詳解 上

    在并發(fā)編程中存在線程安全問題,主要原因有:1.存在共享數(shù)據(jù) 2.多線程共同操作共享數(shù)據(jù)。關(guān)鍵字synchronized可以保證在同一時刻,只有一個線程可以執(zhí)行某個方法或某個代碼塊,同時synchronized可以保證一個線程的變化可見(可見性),即可以代替volatile
    2021-09-09
  • 關(guān)于JAVA中this的使用方法小結(jié)

    關(guān)于JAVA中this的使用方法小結(jié)

    現(xiàn)在讓大家看一個小例子,給你分享一下JAVA中“this”的用法,有需要的朋友可以參考一下
    2013-10-10
  • Spring Boot LocalDateTime格式化處理的示例詳解

    Spring Boot LocalDateTime格式化處理的示例詳解

    這篇文章主要介紹了Spring Boot LocalDateTime格式化處理的示例詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • Java獲取年月日(格式:xxxx年xx月xx日)的方法詳解

    Java獲取年月日(格式:xxxx年xx月xx日)的方法詳解

    在開發(fā)應(yīng)用程序時,經(jīng)常需要獲取當(dāng)前的年、月、日,并以特定格式進行展示或處理,本文將介紹如何獲取年月日,并將其格式化為“xxxx年xx月xx日”的形式,幫助你在應(yīng)用程序中處理日期信息,需要的朋友可以參考下
    2023-10-10
  • 關(guān)于Java的HashMap多線程并發(fā)問題分析

    關(guān)于Java的HashMap多線程并發(fā)問題分析

    HashMap是采用鏈表解決Hash沖突,因為是鏈表結(jié)構(gòu),那么就很容易形成閉合的鏈路,這樣在循環(huán)的時候只要有線程對這個HashMap進行g(shù)et操作就會產(chǎn)生死循環(huán),本文針對這個問題進行分析,需要的朋友可以參考下
    2023-05-05

最新評論

逊克县| 炎陵县| 通榆县| 西丰县| 五莲县| 伊川县| 平果县| 北海市| 隆回县| 义乌市| 天全县| 阳西县| 福安市| 乡宁县| 青神县| 高安市| 长白| 通海县| 务川| 屏东县| 北辰区| 靖安县| 延长县| 天台县| 会同县| 祁连县| 天长市| 星座| 昌都县| 门源| 通化县| 社旗县| 贡嘎县| 左云县| 年辖:市辖区| 洛宁县| 陆良县| 宁蒗| 辽宁省| 盐亭县| 武宣县|