JavaWeb中的組件Filter過濾器解析
過濾器Filter
過濾器Filter的概念
Filter:是一個實(shí)現(xiàn)了特殊接口(Filter)的Java類。
- 實(shí)現(xiàn)對請求資源(jsp,servlet,html)的過濾的功能。
- 過濾器是一個運(yùn)行在服務(wù)器的程序, 優(yōu)先于請求資源(Servlet或者jsp,html)之前執(zhí)行。
- 過濾器是javaweb技術(shù)中最為實(shí)用的技術(shù)之一。
過濾器Filter的作用
Filter: 過濾網(wǎng)站的數(shù)據(jù),對目標(biāo)資源(Servlet,jsp)進(jìn)行過濾。
過濾器常見應(yīng)用:
- 處理中文亂碼
- 登陸驗(yàn)證
- 權(quán)限攔截
- 過濾敏感字符
- …
Filter作用圖示如下:

過濾器Filter的生命周期
| 生命周期 | 階段執(zhí)行時機(jī) | 生命周期方法創(chuàng)建對象 |
| 創(chuàng)建對象 | Web應(yīng)用啟動時 | init方法,通常在該方法中做初始化工作,只執(zhí)行一次 |
| 攔截請求 | 接收到匹配的請求 | doFilter方法,通常在該方法中執(zhí)行攔截過濾,此方法執(zhí)行多次 |
| 銷毀 | Web應(yīng)用卸載前 | destroy方法,通常在該方法中執(zhí)行資源釋放,只執(zhí)行一次 |
過濾器Filter的匹配規(guī)則
過濾器匹配的目的是指定當(dāng)前過濾器要攔截哪些資源。
精確匹配
指定被攔截資源的完整路徑:
<!-- 配置Filter要攔截的目標(biāo)資源 -->
<filter-mapping>
<!-- 指定這個mapping對應(yīng)的Filter名稱 -->
<filter-name>FilterDemo01</filter-name>
<!-- 通過請求地址模式來設(shè)置要攔截的資源 -->
<url-pattern>/servletDemo01</url-pattern>
</filter-mapping>
上述例子表示要攔截映射路徑為/servletDemo01的這個資源
模糊匹配
相比較精確匹配,使用模糊匹配可以讓我們創(chuàng)建一個Filter就能夠覆蓋很多目標(biāo)資源,不必專門為每一個目標(biāo)資源都創(chuàng)建Filter,提高開發(fā)效率。
比如我們配置了url-pattern為/user/*之后,請求地址只要是/user開頭的那么就會被匹配。
<filter-mapping>
<filter-name>Target02Filter</filter-name>
<!-- 模糊匹配:前杠后星 -->
<!--
/user/demo01
/user/demo02
/user/demo03
/demo04
-->
<url-pattern>/user/*</url-pattern>
</filter-mapping>
極端情況:/* 匹配所有請求
擴(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é)尾的請求。
Servlet名稱匹配
<filter-mapping>
<filter-name>Target05Filter</filter-name>
<!-- 根據(jù)Servlet名稱匹配 -->
<servlet-name>Target01Servlet</servlet-name>
</filter-mapping>
過濾器鏈
過濾器鏈的概念
一個請求可能被多個過濾器所過濾,只有當(dāng)所有過濾器都放行,請求才能到達(dá)目標(biāo)資源,如果有某一個過濾器沒有放行,那么請求則無法到達(dá)后續(xù)過濾器以及目標(biāo)資源,多個過濾器組成的鏈路就是過濾器鏈。

過濾器鏈的順序
過濾器鏈中每一個Filter執(zhí)行的順序是由web.xml中filter-mapping配置的順序決定的。如果某個Filter是使用ServletName進(jìn)行匹配規(guī)則的配置,那么這個Filter執(zhí)行的優(yōu)先級要更低。
過濾器鏈的案例
創(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接收到了請求...");
}
}
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)建多個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項目的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>
編寫過濾器(以處理亂碼問題的過濾器為例) 編寫的類繼承的接口不要錯(選擇javax.servlet的Filter接口)
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-Ecg2256t-1629994529684)(C:\Users\張盛濱\AppData\Roaming\Typora\typora-user-images\image-20210827000820318.png)]](http://img.jbzj.com/file_images/article/202310/2023101710014114.jpg)
實(shí)現(xiàn)Filter接口,重寫對應(yīng)的方法即可。
package com.carson.filter;
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
//初始化:當(dāng)web服務(wù)器啟動時,就自動初始化了,隨時等待過濾對象的出現(xiàn)
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CharacterEncodingFilter已經(jīng)初始化");
}
/*
1:過濾器中的所有代碼,在過濾特定請求的時候都會執(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;
解決請求參數(shù)的中文亂碼問題
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
System.out.println("CharacterEncodingFilter執(zhí)行前");
//讓我們的請求繼續(xù)走,如果不寫,程序到這里就會被攔截停止
//即這句代碼表示放行
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("CharacterEncodingFilter執(zhí)行后");
}
//銷毀:當(dāng)web服務(wù)器關(guān)閉的時候,會進(jìn)行銷毀
public void destroy() {
System.out.println("CharacterEncodingFilter已經(jīng)銷毀");
}
}
在web.xml中配置Filter(設(shè)置過濾的路徑)
<!--注冊filter過濾器,類似注冊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的任何請求,都會經(jīng)過這個過濾器-->
<!--即設(shè)置過濾器的過濾請求路徑-->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
到此這篇關(guān)于JavaWeb中的組件Filter過濾器解析的文章就介紹到這了,更多相關(guān)JavaWeb的Filter過濾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java編程實(shí)現(xiàn)郵件定時發(fā)送的方法
這篇文章主要介紹了java編程實(shí)現(xiàn)郵件定時發(fā)送的方法,涉及Java基于定時器實(shí)現(xiàn)計劃任務(wù)的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11
Java HashMap 如何正確遍歷并刪除元素的方法小結(jié)
這篇文章主要介紹了Java HashMap 如何正確遍歷并刪除元素的方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
詳解Spring Data JPA系列之投影(Projection)的用法
本篇文章主要介紹了詳解Spring Data JPA系列之投影(Projection)的用法,具有一定的參考價值,有興趣的可以了解一下2017-07-07
Spring整合Mybatis 掃描注解創(chuàng)建Bean報錯的解決方案
這篇文章主要介紹了Spring 整合Mybatis 掃描注解創(chuàng)建Bean報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10

