SpringBoot Servlet、Filter、Listener、Interceptor、Aspect 的區別和聯繫

參考:

https://www.jianshu.com/p/c4ef6d232e8d

https://www.jb51.net/article/96496.htm

概念

1.servlet:servlet 是一種運行服務器端的 java 應用程序,具有獨立於平臺和協議的特性,並且可以動態的生成 web 頁面,它工作在客戶端請求與服務器響應的中間層。

2.filter:filter 是一個可以複用的代碼片段,可以用來轉換 HTTP 請求、響應和頭信息。Filter 不像 Servlet,它不能產生一個請求或者響應,它只是修改對某一資源的請求或者響應。

3.listener:監聽器。通過 listener 可以監聽 web 服務器中某一個執行動作,並根據其要求作出相應的響應。通俗的說監聽器就是在 applicationsessionrequest 三個對象創建、銷燬或者在其中添加、修改、刪除屬性時自動執行代碼的功能組件。

4.interceptor:動態代理就是攔截器的簡單實現,在調用方法前打印出字符串或者做其它業務邏輯的操作,也可以在調用方法後打印出字符串,甚至在拋出異常的時候做業務邏輯的操作。

5.aspect:可以自定義切入的點,有方法的參數,但是拿不到 http 請求,可以通過其他方式如 RequestContextHolder 獲得。

6.servlet、filter、listener 配置在 web.xml 中,spring 的 interceptor 配置到 spring.xml 中。

7.Filter,Interceptor,Aspect 實際上都是對 AOP 的具體實現。都是對業務邏輯的提取,都可以實現權限檢查,日誌記錄。不同的是使用的範圍不同,規範不同,深度不同。

8.Filter 是 java web 裏面的,獲取不到 spring 裏面 Controller 的信息。Interceptor、Aspect 是和 spring 相關的,所以能獲取到 Controller 的信息。

加載順序

web.xml 的加載順序是:context-param -> listener -> filter -> servlet

另:

在這裏插入圖片描述

職責

servlet

(1)創建並返回一個包含基於客戶請求性質的動態內容的完整的 html 頁面

(2)創建可嵌入到現有的 html 頁面中的一部分 html 頁面(html片段)

(3)讀取客戶端發來的顯示或隱藏數據

(4)通過狀態代碼和響應頭向客戶端發送隱藏數據。

(5)與其他服務器資源(包括數據庫和 java 的應用程序)進行通信

filter

(1)filter 能夠在一個請求到達 servlet 之前預處理用戶請求,也可以在離開 servlet 時處理 http 響應

(2)根據程序需要修改請求和響應

listener

servlet 2.4 規範中提供了 8 個 listener 接口,可以將其分爲三類,分別如下:

(1)與 ServletContext 有關的接口。包括:ServletContextListener、ServletContextAttributeListener

(2)與 HttpSession 有關的接口。包括:HttpSessionListner、HttpSessionAttributeListener、HttpSessionBindingListener、 HttpSessionActivationListener

(3)與 ServletRequest 有關的接口,包括:ServletRequestListner、ServletRequestAttributeListener

Servlet 與 Filter 的區別

1.servlet

servlet 流程是短的,url 傳來之後,就對其進行處理,之後返回或轉向到某一自己指定的頁面。它主要用來在業務處理之前進行控制。

2.filter

流程是線程性的,url 傳來之後,檢查之後,可保持原來的流程繼續向下執行,被下一個 filter, servlet 接收等,而 servlet 處理之後,不會繼續向下傳遞。

filter 功能可用來保持流程繼續按照原來的方式進行下去,或者主導流程,而 servlet 的功能主要用來主導流程。可以將 Filter 看成是 servlet 的一個補充。

filter 可認爲是 servlet 的一種“變種”,它主要用於對用戶請求進行預處理,也可以對 HttpServletResponse 進行後處理,是個典型的處理鏈。

它與 Servlet 的區別在於:它不能直接向用戶生成響應。

完整的流程是:Filter 對用戶請求進行預處理,接着將請求交給 Servlet 進行處理並生成響應,最後 Filter 再對服務器響應進行後處理。

3.匹配規則

當一個請求發送到 servlet 容器的時候,容器先會將請求的 url 減去當前應用上下文的路徑作爲 servlet 的映射 url,比如訪問 http://localhost/test/aaa.html,應用上下文是 test,容器會將 http://localhost/test 去掉,將剩下的 /aaa.html 部分拿來做 servlet 的映射匹配,也就是拿這剩下的部分與 web.xml 中配置的 servlet 的 url-pattern 進行匹配。

注意:這個映射匹配過程是有一定的規則的,而且每次匹配最終都只匹配一個 servlet,這點和 filter 不同。當一個 servlet 匹配成功後就不會在往下去匹配了。

精確路徑匹配:

例子:比如 servlet A 的 url-pattern 爲 /test,servlet B 的 url- pattern 爲 /* ,這個時候,如果訪問的url爲 http://localhost/test ,

這個時候容器就會先進行精確路徑匹配,發現 /test 正好被 servlet A 精確匹配,那麼就去調用 servletA,也不會去理會其他的 servlet。

最長路徑匹配:

例子:servlet A 的 url-pattern 爲 /test/*,而 servlet B 的 url-pattern 爲 /test/a/*,此時訪問 http://localhost/test/a 時,容器會選擇路徑最長的 servlet 來匹配,也就是這裏的 servletB。

擴展匹配:如果 url 最後一段包含擴展,容器將會根據擴展選擇合適的 servlet。

例子:servletA 的 url-pattern:*.action 等等

4.servlet,filter 都是針對 url 的,而 listener 是針對對象的操作的,如 session 的創建,session.setAttribute 的發生,在這樣的事件發生時做一些事情。可用來進行 web 應用定時任務的實現,在線人數的統計等。

5.Spring 中的過濾器和攔截器的區別與聯繫:

(1)攔截器是 Spring 提供的,而過濾器是由 Servlet 標準提供的。

(2)攔截器在 Spring.xml 中配置,而過濾器在 web.xml 文件中配置。

(3)過濾器在配置文件中的位置決定了先後執行順序。

(4)攔截器是基於反射機制的,而過濾器是基於函數回調

(5)過濾器依賴 servlet 容器,而攔截器不依賴 servlet 容器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章