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

JavaWeb中的組件Filter過濾器解析

 更新時(shí)間:2023年10月17日 10:06:18   作者:Carson's blog  
這篇文章主要介紹了JavaWeb中的組件Filter過濾器解析,Filter過濾器是一種用于處理和轉(zhuǎn)換數(shù)據(jù)的工具,常用于Web開發(fā)中,它可以在請(qǐng)求到達(dá)服務(wù)器之前或響應(yīng)返回給客戶端之前對(duì)數(shù)據(jù)進(jìn)行預(yù)處理或后處理,需要的朋友可以參考下

過濾器Filter

過濾器Filter的概念

Filter:是一個(gè)實(shí)現(xiàn)了特殊接口(Filter)的Java類。

  • 實(shí)現(xiàn)對(duì)請(qǐng)求資源(jsp,servlet,html)的過濾的功能。
  • 過濾器是一個(gè)運(yùn)行在服務(wù)器的程序, 優(yōu)先于請(qǐng)求資源(Servlet或者jsp,html)之前執(zhí)行。
  • 過濾器是javaweb技術(shù)中最為實(shí)用的技術(shù)之一。

過濾器Filter的作用

Filter: 過濾網(wǎng)站的數(shù)據(jù),對(duì)目標(biāo)資源(Servlet,jsp)進(jìn)行過濾。

過濾器常見應(yīng)用:

  • 處理中文亂碼
  • 登陸驗(yàn)證
  • 權(quán)限攔截
  • 過濾敏感字符

Filter作用圖示如下:

在這里插入圖片描述

過濾器Filter的生命周期

生命周期階段執(zhí)行時(shí)機(jī)生命周期方法創(chuàng)建對(duì)象
創(chuàng)建對(duì)象Web應(yīng)用啟動(dòng)時(shí)init方法,通常在該方法中做初始化工作,只執(zhí)行一次
攔截請(qǐng)求接收到匹配的請(qǐng)求doFilter方法,通常在該方法中執(zhí)行攔截過濾,此方法執(zhí)行多次
銷毀Web應(yīng)用卸載前destroy方法,通常在該方法中執(zhí)行資源釋放,只執(zhí)行一次

過濾器Filter的匹配規(guī)則

過濾器匹配的目的是指定當(dāng)前過濾器要攔截哪些資源。

精確匹配

指定被攔截資源的完整路徑:

<!-- 配置Filter要攔截的目標(biāo)資源 -->
<filter-mapping>
    <!-- 指定這個(gè)mapping對(duì)應(yīng)的Filter名稱 -->
    <filter-name>FilterDemo01</filter-name>

    <!-- 通過請(qǐng)求地址模式來設(shè)置要攔截的資源 -->
    <url-pattern>/servletDemo01</url-pattern>
</filter-mapping>

上述例子表示要攔截映射路徑為/servletDemo01的這個(gè)資源

模糊匹配

相比較精確匹配,使用模糊匹配可以讓我們創(chuàng)建一個(gè)Filter就能夠覆蓋很多目標(biāo)資源,不必專門為每一個(gè)目標(biāo)資源都創(chuàng)建Filter,提高開發(fā)效率。

比如我們配置了url-pattern為/user/*之后,請(qǐng)求地址只要是/user開頭的那么就會(huì)被匹配。

<filter-mapping>
    <filter-name>Target02Filter</filter-name>

    <!-- 模糊匹配:前杠后星 -->
    <!--
        /user/demo01
        /user/demo02
        /user/demo03
		/demo04
    -->
    <url-pattern>/user/*</url-pattern>
</filter-mapping>

極端情況:/* 匹配所有請(qǐng)求

擴(kuò)展名匹配

<filter>
    <filter-name>Target04Filter</filter-name>
    <filter-class>com.carson.filter.Target04Filter</filter-class>
</filter>
<filter-mapping>
    <filter-name>Target04Filter</filter-name>
    <url-pattern>*.png</url-pattern>
</filter-mapping>

上述例子表示攔截所有以.png結(jié)尾的請(qǐng)求。

Servlet名稱匹配

<filter-mapping>
    <filter-name>Target05Filter</filter-name>
    <!-- 根據(jù)Servlet名稱匹配 -->
    <servlet-name>Target01Servlet</servlet-name>
</filter-mapping>

過濾器鏈

過濾器鏈的概念

一個(gè)請(qǐng)求可能被多個(gè)過濾器所過濾,只有當(dāng)所有過濾器都放行,請(qǐng)求才能到達(dá)目標(biāo)資源,如果有某一個(gè)過濾器沒有放行,那么請(qǐng)求則無法到達(dá)后續(xù)過濾器以及目標(biāo)資源,多個(gè)過濾器組成的鏈路就是過濾器鏈。

在這里插入圖片描述

過濾器鏈的順序

過濾器鏈中每一個(gè)Filter執(zhí)行的順序是由web.xml中filter-mapping配置的順序決定的。如果某個(gè)Filter是使用ServletName進(jìn)行匹配規(guī)則的配置,那么這個(gè)Filter執(zhí)行的優(yōu)先級(jí)要更低。

過濾器鏈的案例

創(chuàng)建ServletDemo01

ServletDemo01.java

public class ServletDemo01 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("ServletDemo01接收到了請(qǐng)求...");
    }
}

web.xml:

<servlet>
    <servlet-name>servletDemo01</servlet-name>
    <servlet-class>com.carson.ServletDemo01</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>servletDemo01</servlet-name>
    <url-pattern>/ServletDemo01</url-pattern>
</servlet-mapping>

<!--創(chuàng)建多個(gè)Filter攔截Servlet:-->
<filter-mapping>
    <filter-name>TargetChain03Filter</filter-name>
    <url-pattern>/ServletDemo01</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>TargetChain02Filter</filter-name>
    <url-pattern>/ServletDemo01</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>TargetChain01Filter</filter-name>
    <url-pattern>/ServletDemo01</url-pattern>
</filter-mapping>

過濾器Filter應(yīng)用示例

Filter開發(fā)步驟:

導(dǎo)包(maven項(xiàng)目的pom.xml)

<dependencies>
        <!--JSP依賴-->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
        </dependency>
        <!--Servlet依賴-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>
        <!--JSTL表達(dá)式的依賴-->
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>
        <!--standard標(biāo)簽庫-->
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
        <!--鏈接數(shù)據(jù)庫-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.19</version>
        </dependency>
    </dependencies>

編寫過濾器(以處理亂碼問題的過濾器為例) 編寫的類繼承的接口不要錯(cuò)(選擇javax.servlet的Filter接口)

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-Ecg2256t-1629994529684)(C:\Users\張盛濱\AppData\Roaming\Typora\typora-user-images\image-20210827000820318.png)]

實(shí)現(xiàn)Filter接口,重寫對(duì)應(yīng)的方法即可。

package com.carson.filter;

import javax.servlet.*;
import java.io.IOException;

public class CharacterEncodingFilter implements Filter {
    //初始化:當(dāng)web服務(wù)器啟動(dòng)時(shí),就自動(dòng)初始化了,隨時(shí)等待過濾對(duì)象的出現(xiàn)
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("CharacterEncodingFilter已經(jīng)初始化");

    }

    /*
    1:過濾器中的所有代碼,在過濾特定請(qǐng)求的時(shí)候都會(huì)執(zhí)行
    2:必須寫chain.foFilter()方法讓過濾器繼續(xù)前進(jìn)
    */

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
		//轉(zhuǎn)換request和response為HttpServlet類型
		HttpServletRequest request = (HttpServletRequest) request;
		HttpServletResponse response = (HttpServletResponse) response;
		解決請(qǐng)求參數(shù)的中文亂碼問題
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=UTF-8");

        System.out.println("CharacterEncodingFilter執(zhí)行前");
        //讓我們的請(qǐng)求繼續(xù)走,如果不寫,程序到這里就會(huì)被攔截停止
        //即這句代碼表示放行
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("CharacterEncodingFilter執(zhí)行后");

    }
    //銷毀:當(dāng)web服務(wù)器關(guān)閉的時(shí)候,會(huì)進(jìn)行銷毀
    public void destroy() {
        System.out.println("CharacterEncodingFilter已經(jīng)銷毀");

    }
}

在web.xml中配置Filter(設(shè)置過濾的路徑)

<!--注冊(cè)filter過濾器,類似注冊(cè)servlet-->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>com.carson.filter.CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <!--filter的路徑配置:只要是/servlet的任何請(qǐng)求,都會(huì)經(jīng)過這個(gè)過濾器-->
        <!--即設(shè)置過濾器的過濾請(qǐng)求路徑-->
        <url-pattern>/servlet/*</url-pattern>
    </filter-mapping>

到此這篇關(guān)于JavaWeb中的組件Filter過濾器解析的文章就介紹到這了,更多相關(guān)JavaWeb的Filter過濾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis-Plus 自動(dòng)填充失效問題解決

    Mybatis-Plus 自動(dòng)填充失效問題解決

    在使用MyBatis-Plus時(shí),自動(dòng)填充功能可能會(huì)失效,這通常與版本和配置有關(guān),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • java編程實(shí)現(xiàn)郵件定時(shí)發(fā)送的方法

    java編程實(shí)現(xiàn)郵件定時(shí)發(fā)送的方法

    這篇文章主要介紹了java編程實(shí)現(xiàn)郵件定時(shí)發(fā)送的方法,涉及Java基于定時(shí)器實(shí)現(xiàn)計(jì)劃任務(wù)的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • Java干貨知識(shí)深入理解內(nèi)部類

    Java干貨知識(shí)深入理解內(nèi)部類

    這篇文章主要介紹了Java干貨知識(shí)深入理解內(nèi)部類,定義在另一個(gè)類或方法中的類就叫做內(nèi)部類,需要的朋友可以參考下
    2019-06-06
  • Java HashMap 如何正確遍歷并刪除元素的方法小結(jié)

    Java HashMap 如何正確遍歷并刪除元素的方法小結(jié)

    這篇文章主要介紹了Java HashMap 如何正確遍歷并刪除元素的方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • SpringBoot如何在普通類加載Spring容器

    SpringBoot如何在普通類加載Spring容器

    這篇文章主要介紹了SpringBoot如何在普通類加載Spring容器,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 詳解Spring Data JPA系列之投影(Projection)的用法

    詳解Spring Data JPA系列之投影(Projection)的用法

    本篇文章主要介紹了詳解Spring Data JPA系列之投影(Projection)的用法,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-07-07
  • Spring整合Mybatis 掃描注解創(chuàng)建Bean報(bào)錯(cuò)的解決方案

    Spring整合Mybatis 掃描注解創(chuàng)建Bean報(bào)錯(cuò)的解決方案

    這篇文章主要介紹了Spring 整合Mybatis 掃描注解創(chuàng)建Bean報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java并發(fā)編程示例(十):線程組

    Java并發(fā)編程示例(十):線程組

    這篇文章主要介紹了Java并發(fā)編程示例(十):線程組,Java提供了ThreadGroup類來控制一個(gè)線程組,一個(gè)線程組可以通過線程對(duì)象來創(chuàng)建,也可以由其他線程組來創(chuàng)建,生成一個(gè)樹形結(jié)構(gòu)的線程,需要的朋友可以參考下
    2014-12-12
  • Spring項(xiàng)目報(bào)錯(cuò)解讀與全部報(bào)錯(cuò)圖文詳解

    Spring項(xiàng)目報(bào)錯(cuò)解讀與全部報(bào)錯(cuò)圖文詳解

    這篇文章主要介紹了Spring項(xiàng)目報(bào)錯(cuò)解讀與全部報(bào)錯(cuò)的相關(guān)資料,在Spring框架開發(fā)中,org.springframework和org.springframework.security相關(guān)報(bào)錯(cuò)通常源于依賴沖突、配置錯(cuò)誤或類路徑缺失,需要的朋友可以參考下
    2026-02-02
  • spring框架集成flyway項(xiàng)目的詳細(xì)過程

    spring框架集成flyway項(xiàng)目的詳細(xì)過程

    今天通過本文給大家分享spring框架集成flyway項(xiàng)目的詳細(xì)過程,由于大多數(shù)都是springboot集成flyway,很少見到spring框架的項(xiàng)目,今天就抽空給大家介紹下spring框架集成flyway項(xiàng)目的方法,一起看看吧
    2021-07-07

最新評(píng)論

高碑店市| 城市| 张家港市| 青阳县| 新津县| 镇远县| 阳朔县| 石门县| 林甸县| 望谟县| 出国| 陆丰市| 新竹县| 德江县| 图木舒克市| 政和县| 剑河县| 田林县| 古交市| 株洲县| 泸定县| 佛山市| 清远市| 铅山县| 锡林浩特市| 呼伦贝尔市| 宝坻区| 彝良县| 团风县| 江油市| 兴业县| 衡南县| 武川县| 沾益县| 新民市| 梅州市| 临潭县| 威信县| 营口市| 安福县| 尉犁县|