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 版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/Jeely/p/10953476.html

ASP.NET MVC Filter过滤机制(过滤器、拦截器)相关推荐

  1. Spring MVC学习(8)—HandlerInterceptor处理器拦截器机制全解

    基于最新Spring 5.x,详细介绍了Spring MVC的HandlerInterceptor处理器拦截器机制,以及它的一系列拦截方法. 本次我们来学习Sring MVC的HandlerInter ...

  2. Asp.net MVC Filter监控页面性能和运行时间

    本篇文章作用说明: Asp.net MVC Filter监控View实例,监控每个View页面加载的时间,跟踪分析每个页面的加载性能,然后做进一步优化: 问题背景 最近,客户一直反馈系统使用慢,有时候 ...

  3. SSM框架之Spring MVC(四)异常处理和拦截器实现

    一.SpringMVC中的异常处理 1.1异常处理的思路 系统中异常包括两类:预期异常和运行时异常 RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通 ...

  4. SpringBoot的过滤器拦截器AOP和异常处理器

    目录 前言 过滤器 创建过滤器 拦截器 创建拦截器 配置拦截器 AOP 创建AOP 异常处理器 创建异常处理器 测试请求的执行过程 创建接口 发送请求 前言 过滤器.拦截器.AOP.异常处理器是搭建系 ...

  5. Asp.Net MVC 3【Filters(过滤器)】

    这里分享MVC里的Filters(过滤器),什么是MVC里的过滤器,他的作用是什么? 过滤器的请求处理管道中注入额外的逻辑.他们提供了一个简单而优雅的方式来实现横切关注点.这个术语是指所有对应用程序的 ...

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

    在<使用篇>中我们谈到扩展的验证编程方式,并且演示了本解决方案的三大特性:消息提供机制的分离.多语言的支持和多验证规则的支持,我们现在来看看这样的验证解决方案最终是如何实现的. 目录: 一 ...

  7. 【ASP.NET MVC】 路由机制:命名路由

    首先看一下命名路由和没有命名的差别: 命名路由: routes.MapRoute(name: "Test", // Route nameurl: "code/p/{act ...

  8. Java中Filter、Listener,拦截器的学习,listener、 filter、servlet 加载顺序及其详解

    Filter filter可认为是Servlet的一种"变种",它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链.它与Se ...

  9. 过滤器 拦截器 区别

    转 http://www.cnblogs.com/wangyuyu/archive/2013/07/02/3167354.html 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过 ...

最新文章

  1. JAVA md5加密的工具类
  2. DCMTK:演示状态查看器-网络发送组件(存储SCU)
  3. 微信小程序入门三:轮播图
  4. 第一册:lesson forty three。
  5. mysql命令常用参数实例讲解
  6. arcgis for android 学习 - (5) 在地图指定位置添加“标记“,并尝试选中它
  7. php 导出csv格式的文件
  8. Outlier Detection with Isolation Forest(孤立森林异常检测)
  9. 卖家如何利用关键词进行SEO优化以提高排名?
  10. pthread_getspecific和pthread_setspecific使用:同一线程内的各个函数间共享数据
  11. 一名年薪百万阿里P8架构师写给Java程序员一些建议(架构师必备)
  12. 调用的目标发生异常 targetinvocationexception
  13. 全国计算机二级office选择题知识点,全国计算机二级考试MS office选择题知识点合集(通用)...
  14. Word文档重新打开时恢复到上次阅读位置
  15. 【OpenGL】实现三维空间漫游和立方体、球体贴图
  16. 直播系统开发,一对一直播源码开发
  17. java下载文件(多个文件进行打包下载)
  18. 传播特性与频率的关系
  19. bi实现不同企业管理驾驶舱面板
  20. cnc难还是java难_英语八级难考过吗?大概要学多久?

热门文章

  1. PetShop之ASP.NET缓存(转载)
  2. 2021年兰州师大附中高考成绩查询,2021年兰州重点高中名单及排名,兰州高中高考成绩排名榜...
  3. 正确退出activity_如何退出Activity
  4. oracle+trace参数设置,Oracle autotrace参数详解
  5. socket 编程:回射客户/服务程序
  6. leetcode 344. 反转字符串 541. 反转字符串 II 双指针解
  7. python 示例_带有示例的Python File write()方法
  8. python sep函数_Python中带有print()函数的sep参数
  9. c++ stl队列初始化_声明,初始化和访问向量| C ++ STL
  10. Java——IO(打印流)