zoukankan      html  css  js  c++  java
  • ASP.NET MVC5学习笔记之Filter基本介绍

     Filter是ASP.NET MVC框架提供的基于AOP(面向方面)设计,提供在Action执行前后做一些非业务逻辑通用处理,如用户验证,缓存等。现在来看看Filter相关的一些类型信息。

    一.基本类型

    1. Filter类型,描述筛选器信息的元数据类型,具体定义如下:

     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中指定的。

     2. FilterAttribute类型

    对于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的成员,定义如下:

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

    AllowMultiple表示是否可指定筛选器特性的多个实例, Order属性设置Filter执行顺序,最终会传给Filter类型.

    3.ActionFilterAttribute类型

    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框架揭密

  • 相关阅读:
    中国大陆地区用户请特别注意:请勿存放违反当地法律法规文件
    JAVA日报
    JAVA日报
    JAVA日报
    JAVA日报
    JAVA日报
    JAVA日报
    JAVA日报
    JAVA日报
    JAVA日报
  • 原文地址:https://www.cnblogs.com/jjyjjyjjy/p/3660683.html
Copyright © 2011-2022 走看看