https://blog.csdn.net/knqiufan/article/details/82413885

本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/knqiufan/article/details/82413885参考文章:1、https://www.cnblogs.com/webapi/p/5669057.html
                  2、https://shiyousan.com/post/635835285087587126
在MVC中有一个过滤机制,可以编写为过滤器或拦截器,用于对在某个Action执行前后再执行的动作。
过滤器继承自ActionFilterAttribute类(命名空间是System.Web.Mvc)

ActionFilterAttribute类是一个特性类。
在菜鸟教程中,对特性是这么描述的:(链接:http://www.runoob.com/csharp/csharp-attribute.html)
特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。
特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。.Net 框架提供了两种类型的特性:预定义特性和自定义特性
ActionFilterAttribute实现了两个很重要的接口:IActionFilter,IResultFilter

ActionFilterAttribute实现了它们,那么自然也拥有这四个方法
首先,IActionFilter接口的 OnActionExecuting方法和OnActionExecuted方法:
        //该方法会在action方法执行之前调用          public override void OnActionExecuting(ActionExecutingContext filterContext)          {              filterContext.HttpContext.Response.Write("我是OnActionExecuting,我在action方法调用钱执行<br/>");              base.OnActionExecuting(filterContext);          }            //该方法会在action方法执行之后调用          public override void OnActionExecuted(ActionExecutedContext filterContext)          {              filterContext.HttpContext.Response.Write("我是OnActionExecuted,我在action方法调用后执行<br/>");              base.OnActionExecuted(filterContext);          }  调用的时候直接这么调用:
[MyFilter]  public void FilterTest()  {       Response.Write("我是action方法,在这里执行了</br>");  }要在一个action方法中使用一个过滤器,只要在该方法上贴一个过滤器的标签就ok了。
 
但是有时候我们会有这样的一需求:
在过滤器中当遇到了贴了某某标签的action方法就跳过不进行验证
这怎么办呢?
可以通过filterContext的ActionDescriptor属性类完成这易操作
ActionDescriptor顾名思义,action方法的描述着
在ActionDescriptor中我们可以拿到相应的action方法信息,甚至还可以拿到一个控制器描述着ControllerDescriptor
代码如下:
        //该方法会在action方法执行之前调用          public override void OnActionExecuting(ActionExecutingContext filterContext)          {              filterContext.HttpContext.Response.Write("我是OnActionExecuting,我在action方法调用前执行<br/>");              //判断该action方法时候有贴上MyFilter1Attribute标签              if (filterContext.ActionDescriptor.IsDefined(typeof (MyFilter1Attribute),false))              {                  //如果有,为该action方法直接返回ContentResult,则该action方法在这里就有了返回值,相当于在这里就结束了,不会在去执行之后的方法,如:OnActionExecuted等                  filterContext.Result = new ContentResult();              }              base.OnActionExecuting(filterContext);          }这样action方法中和OnActionExecuted中的Response.Write都没有被执行,也就是说,该action方法被跳过了
 
接下来看看IResultFilter接口的两个方法:OnResultExecuting方法和OnResultExecuted方法
        //在action方法返回结果之后执行          public override void OnResultExecuting(ResultExecutingContext filterContext)          {              filterContext.HttpContext.Response.Write("我是OnActionExecuting,我action方法返回结果之前执行<br/>");              base.OnResultExecuting(filterContext);          }            //在action方法返回结果之前前执行          public override void OnResultExecuted(ResultExecutedContext filterContext)          {              filterContext.HttpContext.Response.Write("我是OnResultExecuted,我在action方法返回结果之后执行<br/>");              base.OnResultExecuted(filterContext);          }使用方法和IActionFilter的使用方法是一样的。
IResultFilter接口中的方法和IActionFilter方法的区别就是执行位置不一样。
 
mvc框架中还有一个过滤器,他就是权限过滤器AuthorizeAttribute
该过滤器在所有action方法过滤器之前执行,也就是说,提供了一个可以超前验证的方法
我们在添加一个新的过滤器类,并继承自AuthorizeAttribute
重写其OnAuthorization方法如下:
【注意,把基类的OnAuthorization方法去掉,因为我们并不需要,而且留着可能会出现一些错误异常】
    public class MyFilterReAttribute:AuthorizeAttribute      {          //在所有action方法过滤器之前执行          public override void OnAuthorization(AuthorizationContext filterContext)          {              filterContext.HttpContext.Response.Write("我是OnAuthorization,在所有action方法过滤器之前执行<br/>");              //base.OnAuthorization(filterContext);          }      }        [MyFilter]          [MyFilterRe]          public ActionResult FilterTest()          {              Response.Write("我是action方法的Response.Write,在这里执行了~~</br>");              return View();          }运行之后:

这样我们就可以根据需要选择合适的方法进行权限验证,过滤,拦截等等动作。
如果控制器中的所有action都需要验证等,那么就可以在控制类中统一贴上标签:

这样该控制器中的所有action方法都会进行验证
那么,如果每个控制器都需要验证、过滤、拦截呢?
这个时候就需要打开App_Start文件夹,打开FilterConfig类,在这里面添加全局的过滤器:

下面简单说一下FilterConfig类。
在Global.asax文件中,FilterConfig类是全局Filter的管理器:

FilterConfig类在项目的App_Start文件夹下:

默认已经注册了一个HandleErrorAttribute类(异常过滤器),我们可以通过GlobalFilterCollection 类对全局过滤器进行管理,比如对全局过滤器进行注册、删除和管理运行顺序等操作

【备注:所谓的全局过滤器,就是会应用到所有操作方法和控制器的过滤器,一旦在FilterConfig类中注册了某个过滤器,就不需要再额外去控制器中声明。】
 --------------------- 作者:knqiufan 来源:CSDN 原文:https://blog.csdn.net/knqiufan/article/details/82413885 版权声明:本文为博主原创文章,转载请附上博文链接!

ASP.NET MVC Filter过滤机制(过滤器、拦截器)的更多相关文章

  1. 【ASP.NET MVC系列】浅谈ASP.NET MVC资源过滤和授权

    最近比较忙,博客很久没更新了,很多博友问何时更新博文,因此,今天就花了点时间,写了本篇文章,但愿大家喜欢. 本篇文章不适合初学者,需要对ASP.NET MVC具有一定基础. 本篇文章主要从ASP.NE ...

  2. Asp.Net MVC学习总结之过滤器详解(转载)

    来源:http://www.php.cn/csharp-article-359736.html   一.过滤器简介 1.1.理解什么是过滤器 1.过滤器(Filters)就是向请求处理管道中注入额外的 ...

  3. ASP.NET MVC中有四种过滤器类型

    在ASP.NET MVC中有四种过滤器类型

  4. MVC中的过滤器/拦截器怎么写

    创建一个AuthenticateFilterAttribute(即过滤器/拦截器) 引用System.Web.Mvc; public class AuthenticateFilterAttribute ...

  5. ASP.NET MVC的运行机制--url的全局分析

    全局 首先我们来看一副图片       首先,用户通过Web浏览器向服务器发送一条url请求,这里请求的url不再是xxx.aspx格式,而是http://HostName/ControllerNam ...

  6. 【MVC】ASP.NET MVC Forms验证机制

    http://www.cnblogs.com/bomo/p/3309766.html 随笔 - 121  文章 - 0  评论 - 92 [MVC]ASP.NET MVC Forms验证机制 ASP. ...

  7. Asp.Net Mvc: 浅析TempData机制(转发 作者: Tristan G )

    Asp.Net Mvc: 浅析TempData机制 环境: Windows 2008, VS 2008 SP1, Asp.Net Mvc 1.0 --------------------------- ...

  8. 通过扩展改善ASP.NET MVC的验证机制[实现篇]

    原文:通过扩展改善ASP.NET MVC的验证机制[实现篇] 在<使用篇>中我们谈到扩展的验证编程方式,并且演示了本解决方案的三大特性:消息提供机制的分离.多语言的支持和多验证规则的支持, ...

  9. 通过扩展改善ASP.NET MVC的验证机制[使用篇]

    原文:通过扩展改善ASP.NET MVC的验证机制[使用篇] ASP.NET MVC提供一种基于元数据的验证方式是我们可以将相应的验证特性应用到作为Model实体的类型或者属性/字段上,但是这依然具有 ...

随机推荐

  1. JAVA总结--多线程

    一.概念 1.进程:一个具有一定独立功能的程序,关于某些数据集合,一次运行活动. 两点:1.有自己的空间存储数据:2.一个程序. 进程,是系统   进行   资源分配  和 调度  的基础单位.动态性 ...

  2. Count Color poj2777 线段树

    Count Color poj2777 线段树 题意 有一个长木板,现在往上面在一定区间内刷颜色,后来刷的颜色会掩盖掉前面刷的颜色,问每次一定区间内可以看到多少种颜色. 解题思路 这里使用线段树,因为 ...

  3. POJ 1383题解(树的直径)(BFS)

    题面 Labyrinth Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 4997 Accepted: 1861 Descript ...

  4. [好好学习]在VMware中安装Oracle Enterprise Linux (v5.7) - (4/5)

  5. SQL语句分类

    SQL Structured Query Language SQL是结构化查询语言,是一种用来操作RDBMS的数据库语言,当前关系型数据库都支持使用SQL语言进行操作,也就是说可以通过 SQL 操作 ...

  6. 利用C51单片机模拟SPI进行双机通信

    SPI协议简述 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口.由Motorola首创.SPI接口主要应用在 EEPROM,FLASH,实时时 ...

  7. CF3D Least Cost Bracket Sequence(2500的实力贪心...

    哎,昨天一直在赶课设..没有写 最近听了一些人的建议,停止高级算法的学习,开始刷cf. 目前打算就是白天懒得背电脑的话,系统刷一遍蓝书紫书白书之类的(一直没系统刷过),回宿舍再上机吧. https:/ ...

  8. HTTP post get request 时遇到特殊字符 ! @ # $ % ^ & * ( )

    HTTP post get request 时遇到特殊字符 ! @ # $ % ^ & * ( ) 使用对应的编码替代 例如: curl ftp://username:pass@word@ex ...

  9. NOIP原题板刷

    update 10.11 我可能已经刷完大部分了,可是这篇blog我也不想更了 这个人很懒,做了很多题但是不想写题解,也不想更blog,所以这篇blog又咕咕了. 把从 \(1997-2017\) 近 ...

  10. 未来HTML5的发展前景如何?黑客专家是这样回答的

    如果你想进军IT行业,如果你准备好掌握一项新技术,那么就选择HTML5.近日,我们采访了国内知名网络黑客安全专家郭盛华,帮助您了解当今最重要的技术.在本篇文章中,黑客安全专家郭盛华回答了有关HTML5 ...