• MVC4的过滤器


    过滤器

                           

    提供的四种基本类型过滤器接口,IAuthorizationFilter、IActionFilter、IResultFilter和IExceptionFilter,可通过继承对应的接口和FilterAttrbute特性,定义自己的过滤器,也可继承内置的过滤器,重写相应的方法,完成自己的需求。

    授权:IAuthorizeFilter  授权过滤器接口,对身份进行验证

    活动:IActionFilter     行为过滤器接口, 执行Action方法前后执行逻辑

    结果:IResultFilter       结果过滤器接口,提供了在返回结果前后执行方法

    异常:IExceptionFilter  异常过滤器接口,可对其设定在出现异常后的处理方式和方法。

    一.授权过滤器:

    AuthorizeAttribute:授权过滤器特性,继承 FilterAttribute, IAuthorizationFilter

    若是要自定义授权特性,可以继承于AuthorizeAttribute,然后重写AuthorizeCore(自定义授权)和HandleUnauthorizedRequest(授权失败执行逻辑)的方法。也可以直接继承于FilterAttribute和IAuthorizationFilter,重写OnAuthorization方法。

    二:方法/行为结果过滤器:

    自定义方法行为过滤器,只需要继承于ActionFilterAttribute即可,也可根据自己所需,是否继承IActionFilter和IResultFilter,再继承于FilterAttribute,自定义过滤器。

     

     

    ActionFilterAttribute 继承了IActionFilter,IResultFilter接口,实现了接口方法。

     

    OnActionExecuting:执行Action前执行

    OnActionExecuted:执行Action后执行

    OnResultExecuting:返回结果前执行方法

    OnResultExecuted:返回结果后执行方法

     

    三:异常过滤器

    自定义异常过滤器,只需要继承于内置HandleErrorAttribute接口即可。也可自定义异常过滤器,继承于FilterAttribute 和IExceptionFilter.

     

    OnException方法:在抛出异常时执行的方法。启用这个异常功能:

    使用异常过滤器,需要两个步骤:

       Web.Config 文件配置

       <customErrors  mode="On"></customErrors>

    开启自定义错误配置

       使用handleError特性注释动作或控制器类

       [HandleError (Order = 1 ,ExceptionType = typeof(sqlException),

       View = "错误处理的视图")]

    Pubic  ActionResult About(){}

     

    Filter执行顺序

    根据Order, Scope属性来过滤器的执行顺序,如果Order相同,则根据Scope来最终决定执行顺序。

    执行优先级:Global过滤器—>Controller过滤器—>Action过滤器

    public enum FilterScope
    {
        Action = 30,
        Controller = 20,
        First = 0,
        Global = 10,
        Last = 100
    }

    FilterProviders:

    为筛选器提供一个注册点,内部有一个FilterCollection类型的Providers属性,可对筛选器集合进行添加,移除等操作。

    FilterProviders用于注册FilterProvider的,静态构造器在加载的时候,会默认创建三种类型的对象并将其作为表示FilterProviderCollection集合的Providers属性值,

    其构造函数如下:

    static FilterProviders()
        {
            Providers = new FilterProviderCollection();
            Providers.Add(GlobalFilters.Filters);
            Providers.Add(new FilterAttributeFilterProvider());
            Providers.Add(new ControllerInstanceFilterProvider());
        }
     

    构造函数中添加了全局过滤器和其他两个Provider对象. GlobalFilters的Filters属性的类型为GlobalFilterConllection。Providers是提供了一个注册点,首先注册全局过滤器

    FilterAttribute 与FilterAttributeFilterProvider

    FilterAttribute是所有过滤器的基类,其继承于Attribute和IMvcFilter接口.

     

    ControllerDesciptor和ActionDescriptor

    分别表示Controller和Action的ControllerDescriptor和ActionDescriptor实现了ICustomAttributeProvider接口,使其保证能使用Action和Controller上以及FilterAttribute上的所有特性。这两个类型也单独的实现了获得FilterAttribute的方法。

     

     

    Controlles与ControllerInstanceFilterProvider

    Controller内部也继承了筛选器的四大特性,可以说Controller本身就是一个过滤器。

     

    ControllerInstanceFilterProvider是针对Controller的特殊的Filter,它的内部的GetFilter方法是通过指定的ControllerContext获得对应的Controller对象,并创建一个对应的Filter,Controller对象作为Filter对象的Instance属性值,这个Scope值为First,所以为第一个执行。

     

     

    GlobalFilterCollection(全局过滤器集合)

    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);  

    //默认注册一个HanderError 过滤器

    注册全局过滤器:GlobalFiters.Filters.add(new HanderError());

     

    疑问:

    1、Controller上的过滤器与Action中的过滤器什么区别?

    Controller 上的过滤器比Action先执行,这是根据内部的FilterScope指定的。Controller上的过滤器应用于整个控制器,而Action的过滤器只应用于当前标识的action方法中。

    2.Controller上的过滤器是否会继承父Controller上的过滤器

    会的,只要在父Controller上标识了过滤器,其子Controller也会执行这个过滤器。

    见演示。

    MVC内置的过滤器:

    一、OutputCache

    它有一个默认的构造器,并有很多属性,这里选择几个说明一下:

    ·Duration 缓存的时间周期,以秒计

    ·Location 用于指定输出缓存项的位置

    这个属性是一个枚举值:

    public enum OutputCacheLocation
    {
        Any,
        Client,
        Downstream,
        Server,
        None,
        ServerAndClient
    }
     

    默认值是Any,表示输出缓存可用于所有请求,包括客户端浏览器、代理服务器或处理请求的服务器上。

    ·VaryByParam 定义了一个分号分隔的字符串列表,用于使输出缓存发生变化。默认情况下,这些字符串与用GET方法属性发送的查询字符串值对应,或与用POST方法 发送的参数对应。当将该属性设置为多参数时,对于每个指定的参数,输出缓存都包含一个请求文档的不同版本。可能的值包括“none”、“*”和任何有效的 查询字符串或POST参数名称。

    ·Shared 布尔值,用于指明输出缓存是否可以被多个页共享。默认值为false

    ·CacheProfile  用于定义与该页关联的缓存设置的名称,类似于与配置文件缓存名称关联。

    ·NoStore 个布尔值,用于决定是否阻止敏感信息的二级存储。

    例如:对时间进行缓存,在视图中:

    @DateTime.Now.ToString()

     

    为Action添加缓存

             [OutputCache(Duration = 60, VaryByParam = "*")]
            public ActionResult Example()
             {
                return View();
             }

    二、ValidateInput

    该Action可以接受Html等危险代码

             [ValidateInput(false)]
            public ActionResult Example()
             {
                return View();
             }

    三、ValidateAntiForgeryTokenAttribute

    用于验证服务器篡改。

             [ValidateAntiForgeryToken]
            public ActionResult Example()
             {
                return View();
             } 

     

    CompressFilterAttribute的使用

    1.创建:

     

    2.使用:

    3.应用效果:

    首先我们看看没有进行GZIP压缩的时候,首页的文件大小是多少?

    再来看看执行了GZIP压缩后,文件的大小是多少?

    压缩率为 71%。

    ValidateAntiForgeryTokenAttribute的使用:

    用于验证服务器篡改。模拟表单提交,加上后,可防止跨站攻击。

    使用:1.在请求表单中添加:@Html.AntiForgeryToken();

    页面上的Html.AntiForgeryToken()会给访问者一个默认为“RequestVerificationToken”的cookie和hide filed。

     

     

     

    2. 在目标action上增加[ValidateAntiForgeryToken]特性,它是一个验证过滤器它主要检查

    (1)请求的是否包含一个约定的AntiForgery名的cookie

    (2)请求是否有一个Request.Form["约定的AntiForgery名"],约定的AntiForgery名的cookie和Request.Form值是否匹配

    生成:Html.AntiForgeryToken()调用了AntiForgery静态类的GetHtml方法,它产生一个随机值然后分别存储到客户端cookie和页面的hidden field中。其中cookie的key的名字和页面hidden field的名字是一样的,默认都是"__RequestVerificationToken"。

    如果页面中不存在id为” __RequestVerificationToken”的hidden field,或者Cookie中的key和页面中的hidden field 值不相等,则直接抛出HttpAntiForgeryException异常

     

    参考网址:http://www.cnblogs.com/dragon_mail/archive/2011/07/10/2102364.html

    http://www.cnblogs.com/ASPNET2008/archive/2010/03/09/1681990.html

    http://msdn.microsoft.com/zh-cn/library/gg416513(v=vs.98).aspx

  • 相关阅读:
    Python数据爬虫,爬链家的二手房信息
    驼峰命名法
    变量
    use strict(变得严格)
    注释
    分号(line break:分行符号)
    使用外部js文件
    confirm
    prompt
    https和http的区别
  • 原文地址:https://www.cnblogs.com/itjeff/p/3957744.html
Copyright © 2020-2023  润新知