Java Web開發(fā)中過濾器和監(jiān)聽器使用詳解
1 Filter
1.1 Filter簡介
- Filter表示過濾器,是JavaWeb三大組件(Servlet、Filter、Listener)之一。
- 過濾器可以把資源的請求攔截下來,從而實(shí)現(xiàn)一些特殊的功能。
- 過濾器一般完成一些通用的操作,比如權(quán)限控制、統(tǒng)一編碼處理、敏感字符處理等等
- Filter流程圖
1.2 Filter的快速入門
Filter和Servlet很相像,步驟也是一樣的。
1.2.1 創(chuàng)建Filter類
- 新建一個Filter.java文件,實(shí)現(xiàn)Filter接口
- 實(shí)現(xiàn)接口后,重寫其三個方法
- 其中都chain.doFilter()是放行的方法
- inti、和destory都是生命周期的函數(shù)
- @WebFilter()配置的是攔截的路徑,當(dāng)訪問這個路徑的時候,F(xiàn)ilter會被調(diào)用
注意:此處導(dǎo)入的Filter 是Javax Servlet包下的
@WebFilter("/index.jsp") public class DemoFilter01 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("1.init......."); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("2.放行前....."); chain.doFilter(request,response); System.out.println("4.放行后....."); } @Override public void destroy() { System.out.println("5.destory...."); } }
1.2.2 訪問index.jsp
由上圖分析所致,當(dāng)我們訪問index.jsp的時候,會調(diào)用Filter,那么我們用代碼檢驗(yàn)一下上面的流程圖。
**按照流程圖,正確的輸出應(yīng)該是1、2、3、4、5,**訪問一下index.jsp
<html> <body> <h2>Hello World!</h2> <% System.out.println("3. 我是index.jsp ......"); %> </body> </html>
結(jié)果證明流程圖是正確的!
1、放行后訪問對應(yīng)資源,資源訪問完成后,還會回到Filter嗎?
會
2、如果回到Filter中,是重頭執(zhí)行還是執(zhí)行放行后的邏輯呢?
放行后的邏輯
1.3 Filter的攔截路徑的配置
配置在**@WebFilter(“”)**中,主要有以下四類
- 攔截具體的資源路徑:/index.jsp,只有訪問index.jsp的時候才會被攔截
- 目錄攔截:/user/*,訪問/user下的所有資源,都會被攔截
- 后綴名攔截:*.jsp 訪問后綴名為jsp的資源,都會被攔截
- 攔截所有:/* 訪問所有的資源,都會被攔截
1.4 過濾器鏈
1.4.1 過濾器鏈簡介
一個web路徑,可以配置多個過濾器,這多個過濾器就被稱為過濾器鏈。
流程圖如下:
見圖知意:
當(dāng)web應(yīng)用有一個A一個B過濾器組成的過濾器鏈時,A放行后,會來到B過濾器。只有兩個過濾器都放行,才會訪問到相應(yīng)的資源。隨后,按照怎么來的,怎么返回的方式,執(zhí)行B、A的放行后邏輯
注意:
為什么是按照A、B,而不是B、A呢?
你以為我瞎說的?其實(shí)不然,**排序方式即為按照字符串排序,**先后執(zhí)行。就是字符串排序小的限制性。
1.4.2 過濾器鏈的例子
由上面的流程圖可知,瀏覽器會按照DemoFilter01 DemoFilter02 的方式 訪問過濾器鏈,所以我們配置了兩個過濾器類。
@WebFilter("/index.jsp") public class DemoFilter01 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("DemoFilter01 init......."); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("1.DemoFilter01 doFilter....."); chain.doFilter(request,response); System.out.println("5.DemoFilter01 doFilter end....."); } @Override public void destroy() { System.out.println("DemoFilter01 destory...."); } }
@WebFilter("/index.jsp") public class DemoFilter02 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("DemoFilter02 init......"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("2.DemoFilter02 doFilter...."); chain.doFilter(request,response); System.out.println("4.DemoFilter02 doFilter end...."); } @Override public void destroy() { System.out.println("DemoFilter02 destory....."); } }
<html> <body> <h2>Hello World!</h2> <% System.out.println("3. index.jsp ......"); %> </body> </html>
效果圖如下:
2 Listener
2.1 概念
- Listener表示監(jiān)聽器,是JavaWeb三大組件之一。
- 監(jiān)聽器可以監(jiān)聽就是在application,session,request三個對象創(chuàng)建、銷毀或者往其中添加修改刪除屬性時自動執(zhí)行代碼的功能組件。
- Listener分類:Javaweb提供了8個監(jiān)聽器(接口)
2.2 監(jiān)聽器的使用
@WebListener public class DemoListener01 implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("contextInitialized...."); } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("contextDestroyed...."); } }
當(dāng)啟動Tomcat的時候,會自動調(diào)用!
ntln(“contextInitialized…”);
}
@Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("contextDestroyed...."); }
}
當(dāng)啟動Tomcat的時候,會自動調(diào)用!

到此這篇關(guān)于Java Web開發(fā)中過濾器和監(jiān)聽器使用詳解的文章就介紹到這了,更多相關(guān)JavaWeb過濾器和監(jiān)聽器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 其中翻轉(zhuǎn)字符串的實(shí)現(xiàn)方法
這篇文章主要介紹了Java 其中翻轉(zhuǎn)字符串的實(shí)現(xiàn)方法,需要的朋友可以參考下2014-02-02springboot+rabbitmq實(shí)現(xiàn)指定消費(fèi)者才能消費(fèi)的方法
當(dāng)項(xiàng)目部署到測試環(huán)境后,QA測試過程中,總是“莫名其妙”的發(fā)現(xiàn)所保存的用戶付款單數(shù)據(jù)有問題。這篇文章主要介紹了springboot+rabbitmq實(shí)現(xiàn)指定消費(fèi)者才能消費(fèi),需要的朋友可以參考下2021-11-11eclipse springboot工程打war包方法及再Tomcat中運(yùn)行的方法
這篇文章主要介紹了eclipse springboot工程打war包方法及再Tomcat中運(yùn)行的方法,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08使用Java8實(shí)現(xiàn)觀察者模式的方法(上)
本文給大家介紹使用java8實(shí)現(xiàn)觀察者模式的方法,涉及到j(luò)ava8觀察者模式相關(guān)知識,對此感興趣的朋友一起學(xué)習(xí)吧2016-02-02解決java.lang.NoClassDefFoundError:lombok/Data報錯問題
在Java開發(fā)中,使用Lombok庫簡化代碼非常普遍,今天在啟動拉取的git代碼時,遇到了java.lang.NoClassDefFoundError:lombok/Data的報錯,經(jīng)過檢查,發(fā)現(xiàn)錯誤的原因是將Date誤寫為Data,且錯誤地引用了lombok.Data包2024-09-09