JavaWeb學(xué)習(xí)筆記之Filter和Listener
Filter:過濾器
過濾器:當(dāng)訪問服務(wù)器的資源時(shí),過濾器可以將請(qǐng)求攔截下來,完成一些特殊的功能。一般用于完成通用的操作。如:登錄驗(yàn)證、統(tǒng)一編碼處理、敏感字符過濾...
過濾器相當(dāng)于瀏覽器與 Web 資源之間的一道過濾網(wǎng),在訪問資源之前通過一系列的過濾器對(duì)請(qǐng)求進(jìn)行修改、判斷以及攔截等,也可以對(duì)響應(yīng)進(jìn)行修改、判斷以及攔截等。
執(zhí)行流程:
客戶端發(fā)出請(qǐng)求,先經(jīng)過過濾器, 如果過濾器放行,那么才能到servlet
如果有多個(gè)過濾器, 那么他們會(huì)按照注冊(cè)的映射順序 來 排隊(duì)。 只要有一個(gè)過濾器, 不放行,那么后面排隊(duì)的過濾器以及咱們的servlet都不會(huì)收到請(qǐng)求。
使用方法:
1.定義一個(gè)類,實(shí)現(xiàn)接口Filter。
2.重寫其中的方法(執(zhí)行攔截的動(dòng)作)
3.配置攔截路徑:使用注解@WebFilter或web.xml
@WebFilter("/*")//訪問所有資源之前,都會(huì)執(zhí)行該過濾器 public class FilterDemo1 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { //過濾器初始化的方法,一般用于申請(qǐng)資源 // init:在服務(wù)器啟動(dòng)后,會(huì)創(chuàng)建Filter對(duì)象,然后調(diào)用init方法。只執(zhí)行一次。用于加載資源 } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //執(zhí)行攔截的動(dòng)作,具體的攔截邏輯寫在這里 //doFilter:每一次請(qǐng)求被攔截資源時(shí),會(huì)執(zhí)行。執(zhí)行多次 System.out.println("filterDemo1被執(zhí)行了...."); //放行 filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { //過濾器銷毀的方法,一般用于釋放資源 //destroy:在服務(wù)器關(guān)閉后,F(xiàn)ilter對(duì)象被銷毀。如果服務(wù)器是正常關(guān)閉,則會(huì)執(zhí)行destroy方法。只執(zhí)行一次。用于釋放資源 } }
過濾器配置詳解
攔截路徑配置:
1. 具體資源路徑: /index.jsp 只有訪問index.jsp資源時(shí),過濾器才會(huì)被執(zhí)行
2. 攔截目錄: /user/* 訪問/user下的所有資源時(shí),過濾器都會(huì)被執(zhí)行
3. 后綴名攔截: *.jsp 訪問所有后綴名為jsp資源時(shí),過濾器都會(huì)被執(zhí)行
4. 攔截所有資源:/* 訪問所有資源時(shí),過濾器都會(huì)被執(zhí)行
Listener:監(jiān)聽器
Servlet 規(guī)范中定義的一種特殊的組件,用來監(jiān)聽 Servlet 容器產(chǎn)生的事件并進(jìn)行相應(yīng)的處理。
事件監(jiān)聽機(jī)制
* 事件 :一件事情
* 事件源 :事件發(fā)生的地方
* 監(jiān)聽器 :一個(gè)對(duì)象
* 注冊(cè)監(jiān)聽:將事件、事件源、監(jiān)聽器綁定在一起。 當(dāng)事件源上發(fā)生某個(gè)事件后,執(zhí)行監(jiān)聽器代碼
ServletContextListener
在 ServletContext 創(chuàng)建和關(guān)閉時(shí)都會(huì)通知 ServletContextListener 監(jiān)聽器。
需要在 web.xml 里面配置監(jiān)聽器。
使用方法:
1.定義一個(gè)類,實(shí)現(xiàn)ServletContextListener接口。
2.重寫方法。
3.進(jìn)行配置
ServletContextListener:監(jiān)聽ServletContext對(duì)象的創(chuàng)建和銷毀
* 方法: * void contextDestroyed(ServletContextEvent sce) :ServletContext對(duì)象被銷毀之前會(huì)調(diào)用該方法 * void contextInitialized(ServletContextEvent sce) :ServletContext對(duì)象創(chuàng)建后會(huì)調(diào)用該方法
使用Filter的登錄攔截的案例
@WebFilter("*.jsp") public class FilterTest1 implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { //判斷是否已經(jīng)登錄了,如果沒有登錄就需要跳轉(zhuǎn)到登錄界面,但是如果訪問的資源路徑本來 //就是登錄頁面,那么就不需要攔截了,這里需要進(jìn)行判斷排除 //記得強(qiáng)制轉(zhuǎn)型 HttpServletRequest request = (HttpServletRequest)req ; //獲取session對(duì)象,看看對(duì)應(yīng)的屬性是否有值 HttpSession session = request.getSession(); Object login = session.getAttribute("login"); //獲取url路徑,看看里面是否是登錄資源相關(guān)的 String requestURI = request.getRequestURI(); //在過濾掉登錄相關(guān)時(shí),一定要排除一些js,css文件 if (login != null || requestURI.contains("/longin.jsp") || requestURI.contains("/css/") || requestURI.contains("/js/") || requestURI.contains("/fonts/") ) { chain.doFilter(req, resp); } else { request.getRequestDispatcher("/longin.jsp").forward(request, resp); } } public void init(FilterConfig config) throws ServletException { } }
總結(jié)
到此這篇關(guān)于JavaWeb學(xué)習(xí)筆記之Filter和Listener的文章就介紹到這了,更多相關(guān)JavaWeb Filter和Listener內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java servlet、filter、listener、interceptor之間的區(qū)別和聯(lián)系
- java 在Jetty9中使用HttpSessionListener和Filter
- Filter、Servlet、Listener的學(xué)習(xí)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Java web三件套listener、filter、servelt原理解析
- 深入了解Java中的過濾器Filter和監(jiān)聽器Listener
- JavaWeb之Filter與Listener使用解析
- Java學(xué)習(xí)手冊(cè)之Filter和Listener使用方法
相關(guān)文章
配置gateway+nacos動(dòng)態(tài)路由管理流程
這篇文章主要介紹了配置gateway+nacos動(dòng)態(tài)路由管理流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Springboot整合fastdfs實(shí)現(xiàn)分布式文件存儲(chǔ)
本文主要介紹了Springboot整合fastdfs實(shí)現(xiàn)分布式文件存儲(chǔ),詳細(xì)闡述了Springboot應(yīng)用程序如何與FastDFS進(jìn)行集成及演示了如何使用Springboot和FastDFS實(shí)現(xiàn)分布式文件存儲(chǔ),感興趣的可以了解一下2023-08-08linux用java -jar啟動(dòng)jar包緩慢的問題
這篇文章主要介紹了linux用java -jar啟動(dòng)jar包緩慢的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,2023-09-09java對(duì)接支付寶支付項(xiàng)目的實(shí)戰(zhàn)記錄
最近公司有一個(gè)需求是接入第三方支付(微信&支付寶),我接到了支付寶支付,所以下面這篇文章主要給大家介紹了關(guān)于java對(duì)接支付寶支付項(xiàng)目的相關(guān)資料,需要的朋友可以參考下2022-06-06SpringBoot自定義HttpMessageConverter操作
這篇文章主要介紹了SpringBoot自定義HttpMessageConverter的操作,具有很好的參考價(jià)值,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Java的鎖機(jī)制:synchronized和CAS詳解
這篇文章主要介紹了Java的鎖機(jī)制synchronized和CAS詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-09-09Hibernate中l(wèi)oad方法與get方法的區(qū)別
Hibernate中有兩個(gè)極為相似的方法get()與load(),他們都可以通過指定的實(shí)體類與ID從數(shù)據(jù)庫中讀取數(shù)據(jù),并返回對(duì)應(yīng)的實(shí)例,但Hibernate不會(huì)搞兩個(gè)完全一樣的方法的2016-01-01