Filter是ASP.NET MVC框架提供的基於AOP(面向方面)設計,提供在Action執行先後作一些非業務邏輯通用處理,如用戶驗證,緩存等。如今來看看Filter相關的一些類型信息。html
一.基本類型web
1. Filter類型,描述篩選器信息的元數據類型,具體定義以下:api
1 public class Filter 2 { 3 // 表示一個用於指定篩選器的默認順序的常數。 4 public const int DefaultOrder = -1; 5 6 public Filter(object instance, FilterScope scope, int? order); 7 8 public object Instance { get; protected set; } 9 10 public int Order { get; protected set; } 11 12 public FilterScope Scope { get; protected set; } 13 }
經過代碼瞭解能夠了解到它封裝了篩選器的實例(Instance屬性),調用的順序(Order屬性)和應用的範圍(Scope屬性)。Order值越小,調用優先級越高。Scope經過FilterScope枚舉定義,它的定義以下:緩存
1 public enum FilterScope 2 { 3 4 First = 0, 5 Global = 10, 6 Controller = 20, 7 Action = 30, 8 Last = 100, 9 }
當兩個同類型的Filter的Order相同時,則Scope來決定調用順序,和Order同樣,值越小,調用優先級越高。Scope一般是在FilterProvier中指定的。cookie
2. FilterAttribute類型mvc
對於Controller和Action Leve的Filter一般是以屬性(Attribute)的應用,ASP.NET MVC提供了一個Filter屬性基類FilterAttribute,定義以下:框架
1 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 2 public abstract class FilterAttribute : Attribute, IMvcFilter 3 { 4 5 protected FilterAttribute(); 6 public bool AllowMultiple { get; } 7 public int Order { get; set; } 8 }
屬性AllowMultiple和Order是接口IMvcFilter的成員,定義以下:asp.net
1 public interface IMvcFilter 2 { 3 bool AllowMultiple { get; } 4 int Order { get; } 5 }
AllowMultiple表示是否可指定篩選器特性的多個實例, Order屬性設置Filter執行順序,最終會傳給Filter類型.異步
3.ActionFilterAttribute類型ide
ActionFilterAttribute通常用於在Action上或ActionResult建立Filter的基類,定義以下:
1 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 2 public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter 3 { 4 // The OnXxx() methods are virtual rather than abstract so that a developer need override 5 // only the ones that interest him. 6 7 public virtual void OnActionExecuting(ActionExecutingContext filterContext) 8 { 9 } 10 11 public virtual void OnActionExecuted(ActionExecutedContext filterContext) 12 { 13 } 14 15 public virtual void OnResultExecuting(ResultExecutingContext filterContext) 16 { 17 } 18 19 public virtual void OnResultExecuted(ResultExecutedContext filterContext) 20 { 21 } 22 }
二.特定Filter介紹
1. IAuthenticationFilter
IAuthenticationFilter是MVC5新增長Filter類型,容許實現自定義的身份驗證。經過前面的介紹,咱們知道它執行在最前面。接口定義以下:
1 public interface IAuthenticationFilter 2 { 3 4 void OnAuthentication(AuthenticationContext filterContext); 5 6 7 void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext); 8 }
因爲前面的小節已介紹,這裏再也不贅述. Controller類實現了該接口, 僅提供了虛方法實現
2. IAuthorizationFilter
該接口執行在Action方法和ActionFilter以前,提供用戶受權或其它檢查的機會.它的接口定義以下:
1 public interface IAuthorizationFilter 2 { 3 void OnAuthorization(AuthorizationContext filterContext); 4 }
有一系列類實現了該接口:
a. ValidateAntiForgeryTokenAttribute
ValidateAntiForgeryTokenAttribute 是爲防止CSRF(Cross-Site Request Forgery)跨站請求僞造攻擊而設計,關於CSRF這裏不介紹了,這個屬性和HtmlHelper.AntiForgeryToken方法協做,在HtmlHelper.AntiForgeryToken中,生成一個加密的Token放在cookie裏,同時在Form裏生成一個隱藏的字段,保存與Token相匹配的值,當頁面提交時,ValidateAntiForgeryTokenAttribute將驗證cookie設置值與Form隱藏字段的值是否匹配,不匹配的話就說明請求是僞造的
b.ValidateInputAttribute
表示對請示輸入進行驗證的標識,防止網站的惡意攻擊,如XSS
它是設置Controller.ValidateRequest屬性,具體的驗證在HttpRequest.ValidateInput方法中
c.ChildActionOnlyAttribute
標識Action只能做爲子Action調用, 當調用Html.Action方法會一個當前Action的ViewContext放到RouteData中,key 爲ParentActionViewContextToken,ChildActionOnlyAttribute檢查RouteData的Key中是否存在ParentActionViewContextToken
d.AuthorizeAttribute
檢查用戶是否經過驗證(IPrincipal.IIdentity.IsAuthenticated),用戶或角色是否在聲明的列表中,另外如查Controller 或Action標識爲AllowAnonymousAttribute將跳過驗證
e.RequireHttpsAttribute
檢查當前的鏈接HttpContext.Request.IsSecureConnection
3. IActionFilter與IResultFilter
這兩個接口分別定義的方法執行在Action執行先後和ActionResult執行先後
1 public interface IActionFilter 2 { 3 void OnActionExecuting(ActionExecutingContext filterContext); 4 void OnActionExecuted(ActionExecutedContext filterContext); 5 } 6 7 8 public interface IResultFilter 9 { 10 void OnResultExecuting(ResultExecutingContext filterContext); 11 void OnResultExecuted(ResultExecutedContext filterContext); 12 }
相關的繼承體系以下所示:
a. OutputCacheAttribute
緩存Action的執行結果,能夠指定多種緩存策略和參數,基本的使用見這裏http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/improving-performance-with-output-caching-cs
主Action和子Action處理策略有點不一樣,具體見這裏的分析http://www.cnblogs.com/majiang/archive/2012/11/23/2784881.html
另外值得一提的是,當你緩存的內容也許有部分片段須要更新, 好比電子商務的產品展現頁面,有一個頁面瀏覽數要實時更新,這個時候能夠利用HttpResponse.WriteSubstitution方法動態更新這個字段,能夠參考這裏http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/adding-dynamic-content-to-a-cached-page-cs
b. AsyncTimeoutAttribute
設置異步操做的超時時間,在OnActionExecuting中Controller的AsyncManager的Timeout屬性
4. IExceptionFilter
在Action或其它Filter執行過程當中,處理拋出的特定異常
1 public interface IExceptionFilter 2 { 3 void OnException(ExceptionContext filterContext); 4 }
繼承體系以下所示:
a. HandleErrorAttribute
聲明異常處理,你能夠聲明一個異常處理類型(默認是Exception,也就是能夠處理全部異常),聲明錯誤處理頁面(默認是Error),另外有兩點值得注意:
1. 未開啓自定義異常錯誤模式時,這個屬性不啓做用
<system.web>
<customErrors mode="On"></customErrors>
</system.web>
2. 只處理http狀態碼是500的錯誤
詳細請參見這裏http://freshbrewedcode.com/jonathancreamer/2011/11/29/global-handleerrorattribute-in-asp-net-mvc3/
b. OutputCacheAttribute
前面已介紹,這裏是發生異常對子Action的緩存作些清理工做.
5. IOverrideFilter
這個接口是MVC5新加的,容許你在更低一級的範圍清除或覆蓋上一級的Filter。定義接口下:
1 public interface IOverrideFilter 2 { 3 Type FiltersToOverride { get; } 4 }
只有一個屬性,只明要覆寫的Filter類型,具體的類族關係以下圖:
關於詳細使用參見如下連接
http://weblogs.asp.net/imranbaloch/archive/2013/09/25/new-filter-overrides-in-asp-net-mvc-5-and-asp-net-web-api-2.aspx
http://www.davidhayden.me/blog/filter-overrides-in-asp-net-mvc-5
參考
Filtering in ASP.NET MVC
http://msdn.microsoft.com/en-us/library/gg416513(v=vs.98).aspx
Understanding ASP.NET MVC Filters and Attributes
http://www.dotnet-tricks.com/Tutorial/mvc/b11a280114-Understanding-ASP.NET-MVC-Filters-and-Attributes.html
ASP.NET MVC框架揭密