我對Filter
和Interceptor
的目的有點困惑。Spring MVC中攔截器和過濾器的區別
正如我從docs瞭解到的,Interceptor
在請求之間運行。另一方面,Filter
在呈現視圖之前運行,但在Controller呈現響應之後運行。
那麼Interceptor中的postHandle()
與Filter中的doFilter()
之間的區別在哪裏?
什麼是應該使用它的最佳實踐? 在這張照片裏工作
Filter
s和Interceptor
s?
我對Filter
和Interceptor
的目的有點困惑。Spring MVC中攔截器和過濾器的區別
正如我從docs瞭解到的,Interceptor
在請求之間運行。另一方面,Filter
在呈現視圖之前運行,但在Controller呈現響應之後運行。
那麼Interceptor中的postHandle()
與Filter中的doFilter()
之間的區別在哪裏?
什麼是應該使用它的最佳實踐? 在這張照片裏工作
Filter
s和Interceptor
s?
從HandlerIntercepter
的javadoc引用:
HandlerInterceptor
基本上類似於一個ServletFilter
,但在 與後者相比,它只是允許自定義預處理與禁止的執行的 選項處理程序本身,並自定義 後處理。過濾器功能更強大,例如它們允許 交換傳遞給 鏈的請求和響應對象。請注意,過濾器在應用程序上下文中被配置爲web.xml
,HandlerInterceptor
。作爲基本方針,細粒度的操作者有關的預處理任務 是
HandlerInterceptor
實現,尤其是 分解出常見的處理程序代碼和授權檢查候選人。在 另一方面,Filter
非常適合請求內容和視圖 內容處理,如多部分形式和GZIP壓縮。這個 通常顯示何時需要將過濾器映射到特定內容類型(例如圖像)或所有請求。
他這樣說:
那麼,是在攔截和 的doFilter()中的過濾器的postHandle()有什麼區別?
postHandle
將在處理程序方法調用之後但在呈現視圖之前調用。因此,您可以將更多模型對象添加到視圖中,但您可以而不是更改HttpServletResponse
,因爲它已經提交。 doFilter
比postHandle
多得多。您可以更改請求或響應並將其傳遞給鏈,甚至可以阻止請求處理。
另外,在preHandle
和postHandle
方法中,您可以訪問處理請求的HandlerMethod
。所以,你可以添加基於處理程序本身的預處理邏輯。例如,您可以添加具有一些註釋的處理程序方法的邏輯。
什麼是應該使用它的最佳實踐?
由於文檔說,細粒度的操作者有關的預處理任務是HandlerInterceptor
實現的候選人,尤其是分解出常見的處理程序代碼和授權檢查。另一方面,Filter
非常適合請求內容和視圖內容處理,如多部分表單和GZIP壓縮。這通常顯示何時需要將過濾器映射到特定內容類型(例如圖像)或所有請求。
由於您可以訪問實際的目標「處理程序」,因此HandlerInterceptor可爲您提供比過濾器更爲細緻的控制 - 這意味着您執行的任何操作都會根據請求實際執行的內容而有所不同(而servlet過濾器通常應用於所有請求 - 只能考慮每個請求的參數)。 handlerInterceptor還提供3種不同的方法,以便在調用處理程序之前,處理程序完成之後但在視圖渲染之前(甚至可以繞過視圖渲染)或視圖本身已經渲染之後,您可以應用行爲。此外,您可以爲不同的處理程序組設置不同的攔截器 - 攔截器在handlerMapping上配置,並且可能有多個handlerMappings。因此,如果你需要做一些完全通用的事情(例如記錄所有請求),那麼過濾器就足夠了 - 但是如果行爲取決於目標處理程序,或者你想在請求處理和視圖之間做一些事情渲染,那麼HandlerInterceptor提供了這種靈活性。
。注意,過濾器被在web.xml中配置,在應用程序上下文的HandlerInterceptor ???你可以解釋一下嗎? – 2017-02-26 18:36:54
* Filter *與Servlet API相關,'HandlerIntercepter'是Spring特有的概念。爲了註冊一個servlet過濾器,你可以使用舊的'web.xml'(Servlet 2.5及更早版本)或新的編程方法(Servlet 3+)來註冊它。由於'HandlerIntercepter'只是一個Spring抽象,你應該在Spring的上下文中註冊 –
Filter與Servlet API相關,HandlerIntercepter是一個Spring特定的概念。 coorect!但無論由web.xml註冊哪個是WebApplication的一部分,每個調度器都是單一的,所以servlet和過濾器都與上下文相關聯,所以將攔截器和過濾器與'rootContext'關聯是一個好習慣,所以如果你有多個調度器所有人都可以分享。 – 2017-02-26 19:23:14