2012-07-26 132 views
11

我一直在研究Grails很長一段時間了。並且對過濾器和攔截器進行一些掃描。兩者都具有跟蹤會話或在特定控制器中重定向未授權用戶的功能。Grails過濾器vs攔截器

但我很困惑何時以及爲什麼我應該使用Filter而不是Interceptor,反之亦然。 鑑於Inceptors有兩個控制器方法beforeInterceptorafterInterceptor以及過濾器a三個常用關閉before,afterafterView

我的問題是使用Filter對攔截器有什麼優缺點,反之亦然。以這種方式,我們開發者可以決定何時,何地以及爲什麼我們應該在特定控制器中使用濾波器或攔截器來執行一些跟蹤,重定向等。

回答

14

當攔截器使用一個或兩個攔截器時邏輯僅適用於該控制器。

當邏輯適用於多個(或全部)控制器,或者在渲染視圖後(如果沒有攔截器相當於afterView)需要做某些事情時,或者如果您只想將所有內容集中在一起一個地方而不是分散在單獨的控制器文件中。

+4

我明白了。但是,你不可以創建一個抽象控制器來保存類似的攔截邏輯,並讓這個控制器成爲所有其他控制器的父代? 在什麼情況下,我們可以說我們需要在其閉包中使用'Filters'聲明filterering邏輯,'afterView'? – 2012-07-26 06:11:35

+0

然後你需要一點不同的邏輯,所以需要創建另一個抽象控制器。過濾器可以幫助您將代碼集中在一個地方,並跳過您不需要的依賴關係。 – 2012-07-26 08:44:53

0

舊的過濾器(來自Grails 2)在Grails 3中已棄用。過濾器的替換爲攔截器。

攔截器的用途是用於以下操作:認證,登錄等。
攔截器(如其名稱所示)攔截傳入的Web請求並觸發相關操作。這些操作在相關的控制器中定義。

攔截器對過濾器有一些主要的好處,例如支持靜態編譯,並支持靈活的配置。
這些是攔截器的主要3種方法:
- 之前布爾(){真}
- 後(布爾值){TRUE}
- 空隙afterView(){}

Iterceptors被配置爲Spring Beans(在Spring應用程序上下文中)並被配置爲通過它們的名稱進行自動連接。