ASP.NET MVC5學習筆記之Filter基本介紹

 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     }
View Code

 經過代碼瞭解能夠了解到它封裝了篩選器的實例(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 }
View Code

 當兩個同類型的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     }
View Code

屬性AllowMultiple和Order是接口IMvcFilter的成員,定義以下:asp.net

1  public interface IMvcFilter
2     {
3         bool AllowMultiple { get; }
4         int Order { get; }
5     }
View Code

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     }
View Code

二.特定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     }
View Code

  因爲前面的小節已介紹,這裏再也不贅述. Controller類實現了該接口, 僅提供了虛方法實現

2. IAuthorizationFilter

  該接口執行在Action方法和ActionFilter以前,提供用戶受權或其它檢查的機會.它的接口定義以下:

1  public interface IAuthorizationFilter
2     {
3         void OnAuthorization(AuthorizationContext filterContext);
4     }
View Code

  有一系列類實現了該接口:

  

  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     }
View Code

  相關的繼承體系以下所示:

 

  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     }
View Code

   繼承體系以下所示:

  

  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     }
View Code

 只有一個屬性,只明要覆寫的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框架揭密

相關文章
相關標籤/搜索