JavaWeb中的組件Filter過濾器解析
過濾器Filter
過濾器Filter的概念
Filter:是一個實現(xiàn)了特殊接口(Filter)的Java類。
- 實現(xiàn)對請求資源(jsp,servlet,html)的過濾的功能。
- 過濾器是一個運行在服務器的程序, 優(yōu)先于請求資源(Servlet或者jsp,html)之前執(zhí)行。
- 過濾器是javaweb技術中最為實用的技術之一。
過濾器Filter的作用
Filter: 過濾網(wǎng)站的數(shù)據(jù),對目標資源(Servlet,jsp)進行過濾。
過濾器常見應用:
- 處理中文亂碼
- 登陸驗證
- 權限攔截
- 過濾敏感字符
- …
Filter作用圖示如下:
過濾器Filter的生命周期
生命周期 | 階段執(zhí)行時機 | 生命周期方法創(chuàng)建對象 |
創(chuàng)建對象 | Web應用啟動時 | init方法,通常在該方法中做初始化工作,只執(zhí)行一次 |
攔截請求 | 接收到匹配的請求 | doFilter方法,通常在該方法中執(zhí)行攔截過濾,此方法執(zhí)行多次 |
銷毀 | Web應用卸載前 | destroy方法,通常在該方法中執(zhí)行資源釋放,只執(zhí)行一次 |
過濾器Filter的匹配規(guī)則
過濾器匹配的目的是指定當前過濾器要攔截哪些資源。
精確匹配
指定被攔截資源的完整路徑:
<!-- 配置Filter要攔截的目標資源 --> <filter-mapping> <!-- 指定這個mapping對應的Filter名稱 --> <filter-name>FilterDemo01</filter-name> <!-- 通過請求地址模式來設置要攔截的資源 --> <url-pattern>/servletDemo01</url-pattern> </filter-mapping>
上述例子表示要攔截映射路徑為/servletDemo01
的這個資源
模糊匹配
相比較精確匹配,使用模糊匹配可以讓我們創(chuàng)建一個Filter就能夠覆蓋很多目標資源,不必專門為每一個目標資源都創(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>
極端情況:/* 匹配所有請求
擴展名匹配
<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
結尾的請求。
Servlet名稱匹配
<filter-mapping> <filter-name>Target05Filter</filter-name> <!-- 根據(jù)Servlet名稱匹配 --> <servlet-name>Target01Servlet</servlet-name> </filter-mapping>
過濾器鏈
過濾器鏈的概念
一個請求可能被多個過濾器所過濾,只有當所有過濾器都放行,請求才能到達目標資源,如果有某一個過濾器沒有放行,那么請求則無法到達后續(xù)過濾器以及目標資源,多個過濾器組成的鏈路就是過濾器鏈。
過濾器鏈的順序
過濾器鏈中每一個Filter執(zhí)行的順序是由web.xml中filter-mapping配置的順序決定的
。如果某個Filter是使用ServletName進行匹配規(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應用示例
Filter開發(fā)步驟:
導包(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表達式的依賴--> <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl-api</artifactId> <version>1.2</version> </dependency> <!--standard標簽庫--> <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接口)
實現(xiàn)Filter接口,重寫對應的方法即可。
package com.carson.filter; import javax.servlet.*; import java.io.IOException; public class CharacterEncodingFilter implements Filter { //初始化:當web服務器啟動時,就自動初始化了,隨時等待過濾對象的出現(xiàn) public void init(FilterConfig filterConfig) throws ServletException { System.out.println("CharacterEncodingFilter已經(jīng)初始化"); } /* 1:過濾器中的所有代碼,在過濾特定請求的時候都會執(zhí)行 2:必須寫chain.foFilter()方法讓過濾器繼續(xù)前進 */ public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //轉換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í)行后"); } //銷毀:當web服務器關閉的時候,會進行銷毀 public void destroy() { System.out.println("CharacterEncodingFilter已經(jīng)銷毀"); } }
在web.xml中配置Filter(設置過濾的路徑)
<!--注冊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)過這個過濾器--> <!--即設置過濾器的過濾請求路徑--> <url-pattern>/servlet/*</url-pattern> </filter-mapping>
到此這篇關于JavaWeb中的組件Filter過濾器解析的文章就介紹到這了,更多相關JavaWeb的Filter過濾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring?Security中使用authorizeRequests遇到的問題小結
Spring?是非常流行和成功的?Java?應用開發(fā)框架,Spring?Security?正是?Spring?家族中的成員,這篇文章主要介紹了Spring?Security中使用authorizeRequests遇到的問題,需要的朋友可以參考下2023-02-02java實現(xiàn)文件切片上傳百度云+斷點續(xù)傳的方法
文件續(xù)傳在很多地方都可以用的到,本文主要介紹了java實現(xiàn)文件切片上傳百度云+斷點續(xù)傳的方法,?文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12Spring?Boot使用線程池處理上萬條數(shù)據(jù)插入功能
這篇文章主要介紹了Spring?Boot使用線程池處理上萬條數(shù)據(jù)插入功能,使用步驟是先創(chuàng)建一個線程池的配置,讓Spring Boot加載,用來定義如何創(chuàng)建一個ThreadPoolTaskExecutor,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2022-08-08Java String字符串和Unicode字符相互轉換代碼詳解
這篇文章主要介紹了Java String字符串和Unicode字符相互轉換代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-05-05eclipse實現(xiàn)Schnorr數(shù)字簽名
這篇文章主要為大家詳細介紹了eclipse實現(xiàn)Schnorr數(shù)字簽名,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-06-06使用springboot對外部靜態(tài)資源文件的處理操作
這篇文章主要介紹了使用springboot對外部靜態(tài)資源文件的處理操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08