过滤器

提供的四种基本类型过滤器接口,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

MVC4的过滤器的更多相关文章

  1. asp.net mvc4 过滤器的简单应用:登录验证

    直接上代码,不要说话. ASP.NET MVC4过滤器的简单应用:验证登录 [AcceptVerbs(HttpVerbs.Post)] public ActionResult login(FormCo ...

  2. MVC4过滤器

    MVC4提供的四种基本类型过滤器接口,IAuthorizationFilter.IActionFilter.IResultFilter和IExceptionFilter,可通过继承对应的接口和Filt ...

  3. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(40)-精准在线人数统计实现-【过滤器+Cache】

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(40)-精准在线人数统计实现-[过滤器+Cache] 系列目录 上次的探讨没有任何结果,我浏览了大量的文章 ...

  4. Asp.Net MVC4中的全局过滤器,

    可以对整个项目进行全局监控. 新建一个MVC4项目,可以在global.asax文件中看到如下代码:  FilterConfig.RegisterGlobalFilters(GlobalFilters ...

  5. C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用

    C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备)  https://blog.csdn.net/u013519551/article/details/51220841 1. . ...

  6. Asp.Net MVC4中的全局过滤器

    可以对整个项目进行全局监控. 新建一个MVC4项目,可以在global.asax文件中看到如下代码:  FilterConfig.RegisterGlobalFilters(GlobalFilters ...

  7. MVC4学习笔记之--身份认证过滤器

    过滤器作为MVC模式中面向切面编程应用很广泛,例如身份验证,日志,异常,行为截取等.博客园里面的大神对应过滤器的介绍以及很多,MVC4中不同的过滤器也介绍得很清楚.FlyDragon  辉太 禁止吸烟 ...

  8. MVC4方法行为过滤器例子(用户登录)

    在Model文件夹下添加一个类MyActionFilterAttribute继承于ActionFilterAttribute: using System; using System.Collectio ...

  9. MVC4过滤器(转)

    先来看看一个例子演示过滤器有什么用: public class AdminController : Controller { // ... instance variables and constru ...

随机推荐

  1. WPF技术触屏上的应用系列(四): 3D效果图片播放器(图片立体轮放、图片立体轮播、图片倒影立体滚动)效果实现

    原文:WPF技术触屏上的应用系列(四): 3D效果图片播放器(图片立体轮放.图片立体轮播.图片倒影立体滚动)效果实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7 ...

  2. ListView滑动删除 ,仿腾讯QQ

    转载请表明出处:http://blog.csdn.net/lmj623565791/article/details/22961279 在CSDN上开了很多大神们的文章,感觉受益良多,也非常欣赏大家的分 ...

  3. 房费制 之 登录BUG

    声明:以下内容只有当你登录到一个username同时,学生不能申请多次登录.         说是BUG,事实上这也不是一个BUG,仅仅是想出一个办法,解决一个大家好多人都没有解决的问题.以下就给大家 ...

  4. 【Android基础】listview控件的使用(1)------最简单的listview的使用

    listview控件是项目开发中最常用的空间之一,我将慢慢推出关于listview的一系列的文章,先从最简单的,系统自带的listview开始吧! 先上效果图: activity_one.xml &l ...

  5. 会员卡管理系统技术解析(十八)Timer定时监听

    会员卡管理系统技术解析(十八)Timer定时监听 在web应用中,有时候客户须要一些定时程序.不须要客户自己去操作.而是由应用程序自行触发(代理)运行某些操作. 这个时候监听与定时器的配合使用就基本能 ...

  6. Android五个布局

    Android五大布局Layout 1,LinearLayout 线性布局(能够嵌套使用): 制定线性布局的排列方式:水平排列 horizontal.垂直排列 vertical eg: android ...

  7. 一切从编辑器说起:web前端代码编辑器

    俗话说:工欲善其事,必先利其器. 工欲善其事必先利其器.谓工匠想要使他的工作做好,一定要先让工具锋利.比喻要做好一件事,准备工作非常重要. 前端写代码也是一样,需要一个好的适合自己的代码编辑器. 我想 ...

  8. SSL探03

    本文探讨了Openssl的Engine机械.Openssl硬件引擎(Engine)可以使用户比較easy地将自己的硬件增加到openssl中去,替换其提供的软件算法. ENGINE 是 OPENSSL ...

  9. JDNI

    JNDI是为了一个最最核心的问题:是为了解耦,是为了开发出更加可维护.可扩展的系统JNDI和JDBC起的作用类似:JDBC(Java Data Base Connectivity,java数据库连接) ...

  10. 但从谈论性能点SQL Server选择聚集索引键

    简单介绍 在SQL Server中,数据是按页进行存放的.而为表加上聚集索引后,SQL Server对于数据的查找就是依照聚集索引的列作为keyword进行了. 因此对于聚集索引的选择对性能的影响就变 ...