簡體   English   中英

Spring MVC中攔截器和過濾器的區別

[英]Difference between Interceptor and Filter in Spring MVC

我對FilterInterceptor的用途有點困惑。

正如我從文檔中了解到的那樣, Interceptor在請求之間運行。 另一方面, Filter在渲染視圖之前運行,但在 Controller 渲染響應之后運行。

那么Interceptor中的postHandle()和Filter中的doFilter()有什么區別呢?

Spring MVC 架構 在哪些用例中應該使用它的最佳實踐是什么? 在這張圖片中, Filter s 和Interceptor s 在哪里工作?

HandlerIntercepterjavadoc

HandlerInterceptor基本上類似於 Servlet Filter ,但與后者相反,它只允許自定義預處理,並帶有禁止執行處理程序本身的選項,以及自定義后處理。 過濾器更強大,例如它們允許交換傳遞給鏈的請求和響應對象。 請注意,過濾器在web.xml配置,應用程序上下文中的HandlerInterceptor

作為基本准則,與細粒度處理程序相關的預處理任務是HandlerInterceptor實現的候選者,尤其是分解出的公共處理程序代碼和授權檢查。 另一方面, Filter非常適合請求內容和視圖內容處理,例如多部分表單和 GZIP 壓縮。 這通常顯示何時需要將過濾器映射到某些內容類型(例如圖像)或所有請求。

話雖如此:

那么Interceptor#postHandle()Filter#doFilter()的區別在哪里呢?

postHandle將在處理程序方法調用之后但在呈現視圖之前調用。 因此,您可以向視圖添加更多模型對象,但您不能更改HttpServletResponse因為它已經提交。

doFilterpostHandle更通用。 您可以更改請求或響應並將其傳遞給鏈,甚至阻止請求處理。

此外,在preHandlepostHandle方法中,您可以訪問處理請求的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM