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

關(guān)于過濾器Filter的介紹和使用詳解

 更新時間:2025年03月25日 09:58:03   作者:透明果凍  
這篇文章主要介紹了關(guān)于過濾器Filter的使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

1.簡介

在 Java Web 開發(fā)中,Filter 是一個非常重要的組件,用于在請求到達(dá) Servlet 之前或響應(yīng)返回客戶端之前對請求和響應(yīng)進(jìn)行預(yù)處理或后處理。

Filter 可以用來實現(xiàn)多種功能,如日志記錄、權(quán)限檢查、編碼轉(zhuǎn)換、請求頭修改等。就好比機(jī)場的層層安檢,對前來的乘客進(jìn)行檢查過濾,攜帶違規(guī)物品,未買機(jī)票等不滿足機(jī)場要求的就會被阻止進(jìn)入。

2.Filter 的工作原理

配置:在 web.xml 文件中或使用注解來配置 Filter。

  • web.xml中配置
<filter>
    <!--設(shè)置filter的別名-->
    <filter-name>LoggingFilter</filter-name>
    <!--filter的字節(jié)碼路徑-->
    <filter-class>com.example.LoggingFilter</filter-class>
</filter>

<filter-mapping>
  	<!--使用filter別名所對應(yīng)的過濾路徑,可以有多個-->
    <filter-name>LoggingFilter</filter-name>
     <!--/*表示對所有路徑進(jìn)行過濾-->
    <url-pattern>/*</url-pattern>
    <!--所要過濾的servlet的別名-->
    <servlet-name>servlet1</servlet-name>
</filter-mapping>

使用注解@WebFilter,它有如下幾個常用的值:

  1. filterName: filter的別名相當(dāng)于標(biāo)簽
  2. urlPatterns:所要過濾的資源url,相當(dāng)于標(biāo)簽
  3. ServletNames:所要過濾的servlet別名,相當(dāng)于 servletNames
@WebFilter(
        filterName = "loggingFilter",
        urlPatterns = {"/servlet1","*.html"},
        servletNames = {"servlet1","Servlet2"}
)

攔截

  • 當(dāng)請求到達(dá)時,Filter 會攔截請求,并執(zhí)行預(yù)處理邏輯。
  • 在請求到達(dá)目標(biāo)資源前所執(zhí)行的一些操作,如檢查用戶是否有權(quán)限訪問記錄、請求和響應(yīng)的信息

放行

  • Filter 可以選擇是否放行請求到目標(biāo)資源(如 Servlet)。此時會執(zhí)行FilterChaindoFilter方法代表放行。
  • FilterChain表示Filter鏈,若對于該資源,后續(xù)還有其他Filter要進(jìn)行過濾,此時的doFilter方法就會轉(zhuǎn)而執(zhí)行其他的Filter;若此時沒有Filter要進(jìn)行過濾,那么便會放行,進(jìn)行目標(biāo)資源的處理(如,servlet)

后處理

  • 在目標(biāo)資源(如 Servlet)處理完請求后
  • Filter 可以對響應(yīng)進(jìn)行后處理

3.Filter的生命周期

包括初創(chuàng)建始化、過濾銷毀四個階段。

階段對應(yīng)方法執(zhí)行時機(jī)執(zhí)行次數(shù)
創(chuàng)建對象構(gòu)造器web應(yīng)用啟動時1次
初始化方法void init(FilterConfig filterConfig)構(gòu)造完畢1次
過濾請求void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)每次請求多次
銷毀default void destroy()web應(yīng)用關(guān)閉時1次

特別注意的的時Filter在web應(yīng)用啟動時就創(chuàng)建了,并且進(jìn)行初始化,這個過程只會出現(xiàn)一次。

4.Filter的執(zhí)行順序

一個web項目中,可以同時定義多個過濾器,當(dāng)多個過濾器對同一個資源進(jìn)行過濾時,工作位置有先后,整體形成一個工作鏈,稱之為過濾器鏈(FilterChain

  • 當(dāng)使用配置文件進(jìn)行配置時
  • 過濾器鏈中的過濾器的順序由<filter-mapping>標(biāo)簽的定義順序決定
  • 當(dāng)使用注解的方式進(jìn)行配置時
  • 通常會把全部的過濾器放在一個包下,此時,執(zhí)行順序為類名的字典排序由小到大依次執(zhí)行

5.一個簡單的Filter的示例

案例要求:

當(dāng)用戶訪問資源時,檢查其是否進(jìn)行登陸,若未登錄則跳轉(zhuǎn)到登錄頁, 若以登錄則放行

@WebFilter("/*")
public class CheckLoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        //向下轉(zhuǎn)型,實現(xiàn)重定向,獲得session等功能
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        // 檢查用戶是否已登錄
        String user = (String) httpRequest.getSession().getAttribute("username");
        if (user == null) {
            // 用戶未登錄,重定向到登錄頁面
            httpResponse.sendRedirect(httpRequest.getContextPath() + "/login");
        } else {
            // 用戶已登錄,放行請求,注意是調(diào)用的FilterChain中的doFilter方法??!
            chain.doFilter(request, response);
        }
    }
}

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

栾川县| 福清市| 宁河县| 易门县| SHOW| 鸡东县| 玉屏| 丽水市| 江阴市| 邮箱| 汉寿县| 正宁县| 外汇| 山丹县| 玛曲县| 炉霍县| 柳江县| 宝兴县| 余姚市| 乌苏市| 岗巴县| 曲阜市| 包头市| 成都市| 马公市| 扶沟县| 刚察县| 仪征市| 绍兴市| 绥滨县| 富源县| 谷城县| 江源县| 清水河县| 黄山市| 芦山县| 西峡县| 勐海县| 昌宁县| 大悟县| 无锡市|