zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    unsupported jsonb version number 123
    如何在MPlayer上支持RTSP
    TDengine 时序数据库的 ADO.Net Core 提供程序 Maikebing.EntityFrameworkCore.Taos
    如何使用IoTSharp对接ModBus?
    如何从源码启动和编译IoTSharp
    Asp.Net Core 自动适应Windows服务、Linux服务、手动启动时的内容路径的扩展方法
    MQTTnet 的Asp.Net Core 认证事件的扩展
    Asp.Net Core 中利用QuartzHostedService 实现 Quartz 注入依赖 (DI)
    The remote certificate is invalid according to the validation procedure 远程证书验证无效
    settings插拔式源码
  • 原文地址:https://www.cnblogs.com/itjeff/p/3957744.html
Copyright © 2011-2022 走看看