JavaWeb中监听器Listener+过滤器filter+拦截器interceptor区别
JavaWeb中監聽器Listener+過濾器filter+攔截器interceptor區別
如果從整個項目中看,一個servlet請求的執行過程就變成了這樣context-param–>listener–>filter–>servlet–>interceptor(指的是攔截器)
1.概念
context-param:就是一些需要初始化的配置,放入context-param中,從而被監聽器(這里特指org.springframework.web.context.ContextLoaderListener)監聽,然后加載;
監聽器(listener):就是對項目起到監聽的作用,它能感知到包括request(請求域),session(會話域)和applicaiton(應用程序)的初始化和屬性的變化;
過濾器(filter):就是對請求起到過濾的作用,它在監聽器之后,作用在servlet之前,對請求進行過濾;
servlet:就是對request和response進行處理的容器,它在filter之后執行,servlet其中的一部分就是controller層(標記為servlet_2),還包括渲染視圖層(標記為servlet_3)和進入controller之前系統的一些處理部分(servlet_1),另外我們把servlet開始的時刻標記為servlet_0,servlet結束的時刻標記為servlet_4。
攔截器(interceptor):就是對請求和返回進行攔截,它作用在servlet的內部,具體來說有三個地方:
區別
1,servlet 流程是短的,url傳來之后,就對其進行處理,之后返回或轉向到某一自己指定的頁面。它主要用來在 業務處理之前進行控制.
2,filter 流程是線性的, url傳來之后,檢查之后,可保持原來的流程繼續向下執行,被下一個filter, servlet接收等,而servlet 處理之后,不會繼續向下傳遞。filter功能可用來保持流程繼續按照原來的方式進行下去,或者主導流程,而servlet的功能主要用來主導流程。
filter可用來進行字符編碼的過濾,檢測用戶是否登陸的過濾,禁止頁面緩存等
3, servlet,filter都是針對url之類的,而listener是針對對象的操作的,如session的創建,session.setAttribute的發生,在這樣的事件發生時做一些事情。
可用來進行:Spring整合Struts,為Struts的action注入屬性,web應用定時任務的實現,在線人數的統計等;
4,interceptor攔截器,類似于filter,不過不是在web.xml,并且不是針對url的而是針對action的,當頁面提交時,進行過濾操作;
使用原則:
對整個流程清楚之后,然后就是各自的使用,在使用之前應該有一個使用規則,為什么這個說,因為有些功能比如判斷用戶是否登錄,既可以用過濾器,也可以用攔截器,用哪一個才是合理的呢?那么如果有一個原則,使用起來就會更加合理。實際上這個原則是有的:
把整個項目的流程比作一條河,那么監聽器的作用就是能夠聽到河流里的所有聲音,過濾器就是能夠過濾出其中的魚,而攔截器則是攔截其中的部分魚,并且作標記。所以當需要監聽到項目中的一些信息,并且不需要對流程做更改時,用監聽器;當需要過濾掉其中的部分信息,只留一部分時,就用過濾器;當需要對其流程進行更改,做相關的記錄時用攔截器。
攔截器這個要詳細講述一下了,上一篇文章說到,Spring的配置文件應該掃描service層及以下,SpringMvc的配置文件應該掃描controller層; 我們在service層如果想做日志的話,可以使用spring aop特性,在spring.xml中配置aspect即可,那么如果想在controller層做日志,相應地,在SpringMvc.xml中應該怎么配置呢?
這個時候就需要攔截器,它其實也是一種aop的實現(aop本身是一種思想),而且這種實現本質上和aspect是一樣的,只是做了更多的事情,我們當然可以在SpringMvc.xml中也配置aspect,不過現在有一個更好的實現,為什么不用呢。
生命周期
1.servlet
servle的生命周期開始于被裝入web服務器的內存中,并在web服務終止或者重新裝入servlet的時候結束;
servlet一旦被裝入web服務器,一般不會從web服務器內存中刪除;直到web服務器關閉;
裝入:啟動服務器時加載servlet的實例;
初始化:web服務器接收到請求時,或者兩者之間的某個時刻啟動,調用init()
調用:從第一次到以后的多次訪問,都只調用doGet()或dopost()方法;
銷毀;停止服務器時調用destroy()方法,銷毀實例;
2.filter
需要實現javax.servlet包的Filter接口的三個方法init(),doFilter(),destroy();
加載:啟動服務器時加載過濾器的實例,并調用init()方法;
調用:每次請求的時候只調用方法doFilter()進行處理;
銷毀:服務器關閉前調用destroy()方法,銷毀實例;
3.listener
web.xml的加載順序是:context-param->listener->filter->servlet
4.interceptor
加載配置文件后初始化攔截器,當有對action的請求的時候,調用interceptor方法,最后也是根據服務器停止進行銷毀;
執行流程:
參考博客:https://blog.csdn.net/Jintao_Ma/article/details/52972482
https://www.cnblogs.com/heyanan/p/9591670.html
總結
以上是生活随笔為你收集整理的JavaWeb中监听器Listener+过滤器filter+拦截器interceptor区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机网络实验报告校园网,校园网规划与设
- 下一篇: Oracle查询表|注释|字段|字段注释