[英]Difference between Interceptor and Filter in Spring MVC
從HandlerIntercepter
的javadoc :
HandlerInterceptor
基本上類似於 ServletFilter
,但與后者相反,它只允許自定義預處理,並帶有禁止執行處理程序本身的選項,以及自定義后處理。 過濾器更強大,例如它們允許交換傳遞給鏈的請求和響應對象。 請注意,過濾器在web.xml
配置,應用程序上下文中的HandlerInterceptor
。作為基本准則,與細粒度處理程序相關的預處理任務是
HandlerInterceptor
實現的候選者,尤其是分解出的公共處理程序代碼和授權檢查。 另一方面,Filter
非常適合請求內容和視圖內容處理,例如多部分表單和 GZIP 壓縮。 這通常顯示何時需要將過濾器映射到某些內容類型(例如圖像)或所有請求。
話雖如此:
那么
Interceptor#postHandle()
和Filter#doFilter()
的區別在哪里呢?
postHandle
將在處理程序方法調用之后但在呈現視圖之前調用。 因此,您可以向視圖添加更多模型對象,但您不能更改HttpServletResponse
因為它已經提交。
doFilter
比postHandle
更通用。 您可以更改請求或響應並將其傳遞給鏈,甚至阻止請求處理。
此外,在preHandle
和postHandle
方法中,您可以訪問處理請求的HandlerMethod
。 因此,您可以根據處理程序本身添加預處理/后處理邏輯。 例如,您可以為具有一些注釋的處理程序方法添加邏輯。
應該在哪些用例中使用它的最佳實踐是什么?
正如文檔所說,與細粒度處理程序相關的預處理任務是HandlerInterceptor
實現的候選者,尤其是分解出的公共處理程序代碼和授權檢查。 另一方面, Filter
非常適合請求內容和視圖內容處理,例如多部分表單和 GZIP 壓縮。 這通常顯示何時需要將過濾器映射到某些內容類型(例如圖像)或所有請求。
從baeldung :
過濾器在請求到達 DispatcherServlet 之前攔截請求,使其成為粗粒度任務的理想選擇,例如:
Authentication
Logging and auditing
Image and data compression
Any functionality we want to be decoupled from Spring MVC
另一方面,HandlerIntercepors 攔截 DispatcherServlet 和我們的控制器之間的請求。 這是在 Spring MVC 框架內完成的,提供對 Handler 和 ModelAndView 對象的訪問。 這減少了重復並允許更細粒度的功能,例如:
Handling cross-cutting concerns such as application logging
Detailed authorization checks
Manipulating the Spring context or model
過濾器: - 顧名思義,過濾器是由 servlet 容器為每個傳入的 HTTP 請求和每個 HTTP 響應執行的 Java 類。 這種方式可以在 HTTP 傳入請求到達資源之前對其進行管理,例如 JSP 頁面、servlet 或簡單的靜態頁面; 以同樣的方式,可以在資源執行后管理 HTTP 出站響應。
攔截器: - Spring 攔截器類似於 Servlet 過濾器,但它們在 Spring 上下文中運行,因此在管理 HTTP 請求和響應方面功能強大,但它們可以實現更復雜的行為,因為可以訪問所有 Spring 上下文。
HandlerInterceptor 為您提供比過濾器更細粒度的控制,因為您可以訪問實際的目標“處理程序”——這意味着您執行的任何操作都可以根據請求實際執行的操作而有所不同(而 servlet 過濾器通常應用於所有請求 - 只能考慮每個請求的參數)。 處理程序攔截器還提供了 3 種不同的方法,以便您可以在處理程序完成之后但在視圖呈現之前(您甚至可以完全繞過視圖呈現)或在視圖本身已呈現之后調用處理程序之前應用行為。 此外,您可以為不同的處理程序組設置不同的攔截器 - 攔截器配置在處理程序映射上,並且可能有多個處理程序映射。
因此,如果您需要做一些完全通用的事情(例如記錄所有請求),那么過濾器就足夠了 - 但是如果行為取決於目標處理程序,或者您想在請求處理和視圖呈現之間做一些事情,那么HandlerInterceptor 提供了這種靈活性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.