1. 程式人生 > >[Java 18_002] Filter 和 Interceptor

[Java 18_002] Filter 和 Interceptor

首先,在 JSP / Servlet 規範中,只定義了 Servlet,Filter,和 Listener;並沒有定義 Interceptor。Interceptor 是某些 MVC 框架中的角色。

Servlet,Filter,Listener 定義在 web.xml 中;而 Interceptor 不在 web.xml 中定義,而是定義在框架的 context 配置檔案中。

Servlet,Filter 和 Listener 的載入順序和它們在 web.xml 中的配置順序無關。另外在 web.xml 中還需要配置 context-param ,為 ServletContext 提供鍵值對,即應用上下文資訊,其載入順序也和在 web.xml 中的配置順序無關。Servlet,Filter 和 Listener 可能會用到 上下文資訊。所以,伺服器啟動後四者的載入順序應為:

  • context-param → Listener → Filter → Servlet

另外,多個 Filter 的載入順序和它們在 web.xml 中的配置順序有關,web 容器按照它們的配置先後順序進行初始化。當請求匹配多個 Filter 時,按照它們在 web.xml 的配置出現順序依次呼叫 doFilter() 方法。

Filter

Filter 在 Java Servlet 2.3 規範中定義,基於函式回撥,主要用於對請求進行預處理以及對響應進行後處理:

  • 在請求到達 Servlet 之前,Filter 先對請求進行攔截,對請求內容進行檢查預處理(如編碼轉換、修改 HttpServletRequest 頭和內容)。處理完後再把合法請求轉發給 過濾鏈的下一個 Filter 或 Servlet,或者把非法請求丟棄掉,不再轉發。
  • Servlet 對請求進行處理並生成響應結果。
  • 在響應返回給客戶端之前,Filter可以再對響應進行攔截,對響應內容進行檢查和後處理(如修改 HttpServletResponse 頭和內容)。再返回給客戶端。

Filter 相當於 Servlet的助手,處理物件主要是請求和響應。多個 Filter 可以協同工作,採用職責鏈的模式,一個 Filter 處理完請求後,呼叫下一個 Filter 來進行處理,各司其職,靈活組合。Filter 的先後順序按照在 web.xml 中 Filter 出現的先後順序。

建立 Filter 必須實現 javax.servlet.Filter 介面,需要在 web.xml 中配置 Filter。

Interceptor

Interceptor 是某些 MVC 框架的角色,是 AOP(Aspect Oriented Programming)思想的體現,在某些方法執行之前或之後進行攔截並進行處理,基於Java反射。

Filter 只能在 Servlet 之前或之後進行處理,而 Interceptor 可以深入到方法執行前後,異常丟擲前後,對匹配攔截規則的多個方法起作用,在方法執行前、方法執行後都能進行處理。也可以阻止方法的執行。

攔截器可以將多個方法的最前和最後的通用的功能獨立出來,供多個方法共享複用。當通用功能改變時,僅需要修改攔截器就行,大大減少了程式碼負擔。

listener

listener是對事件進行監聽和處理的角色,它採用觀察者模式,只有當在這個listener上註冊了的事件發生時,listener才會執行事件處理方法。這些事件舉例:上下文(context)載入事件;session建立或銷燬事件;容器、session或請求的屬性設定或移除事件等。

Spring Interceptor

Spring Interceptor 的功能更為強大,是一個Spring的元件,歸 Spring 管理,配置在 Spring 檔案中,因此能使用 Spring 裡的任何資源、物件,例如 Service 物件、資料來源、事務管理等,通過 IoC 注入到攔截器即可;而 Filter 則不能。

Spring HandlerInterceptor 可以對 Handler 執行的前後進行處理,新增通用的預處理和後處理操作。有關 HandlerInterceptor(及其與 Filter 的比較)參見官方API文件

參考資料

[1] Servlet、Filter、Listener、Interceptor: http://blog.csdn.net/zuoluoboy/article/details/19750699
[2] 過濾器(Filter)和攔截器(Interceptor)的區別: http://blog.csdn.net/xiaodanjava/article/details/32125687
[3] Spring filter和攔截器(Interceptor)的區別和執行順序: https://www.cnblogs.com/ycpanda/p/3637312.html
[4] HandlerInterceptor: https://docs.spring.io/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/HandlerInterceptor.html