MVC5-11 淺談攔截器


Filter攔截器

Aop是MVC的主要設計方式之一,而微軟也希望我們在使用MVC的時候更好的使用攔截器來進行切面編程。攔截器則是Mvc中的一大亮點與重點

AOP(面向切面)編程已經廣泛應用在各個項目中,切面編程把我們的action切出了執行前與執行后或者是特定的需求比如異常發生時。讓我們可以在切面中從容的完成記日志、檢查權限等操作。在action中開發人員只需要關於核心業務。

可以看到Controller已經為我們集成了一些Filter接口

image

 

IActionFilter  -- >  Action執行前后

IAuthenticationFilter  --> Action安全驗證

IAuthorizationFilter    --> Action身份驗證

IExceptionFilter           --> Action出現異常時

IResultFilter                 --> 結果返回前后

但是我們的Controller並沒有去實現這些接口中的方法,而是留給了子類也就是xxxController我們的控制器去實現。我們可以去重寫方法,但是這種方式只能在當前的控制器生效,並不能在其它的控制器中生效,這顯然並不是我們想要的。

image

 

現在我需要在action執行前去驗證一下參數的合法性並適用與所有的Controller,我們可以創建一個Attribute繼承IActionFilter和Attribute,更簡單的我們可以直接繼承ActionFilterAttribute重寫OnActionExecuting方法 (actionFilterAttribut繼承了IActionFilter與IResultFilter)

下面進行了簡單的一個判斷,如果UserName為null或者不等於admin就跳轉到Error頁面

image

然后再加到action上就可以完成了,但是上面提到了,我們在所有的Controller中都要用到,難道里面每個action都要去加,這太麻煩。 我們可以加到Filter的集合中在Global中進行初化。

image

image

 

淺談內部原理

這里不對所有的攔截器都演示一次,因為講起來篇幅挺多的。大多在博客園都可以找到不錯的文章。這里講一下像ActionFilter背后是如何實現的,是如何在action前后進行攔截的

 

image

 

重點其實就在AsyncControllerActionInvoker類中的InvokeActionMethodFilterAsynchronouslyRecursive方法,在這里執行了filter的OnActionExceuting方法,然后判斷Result是否為空,否的話就直接到OnActionExecuted不會走action了。 在try里可以看到方法是遞歸調用的,正常的話會去執行我們的action然后再回到這邊調用OnActionExceuted

image

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM