ASP.NET MVC Filter过滤机制(过滤器、拦截器)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elk docker

换了个运行环境,重新搭建一套公司本地内部的ELK,之前也搭过(可访问:https://yanganlin.com/31.html),最近做什么事情都想用Docker,这次也用Docker,还算顺利,没掉什么坑里,上次搭建,也用用的6.2的版本,这都过了一年,Elk这三个产品,都已经上7了,用docker搭建的还是用6.2.4,稳定不…

LeetCode Largest Number

1231231转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/10954249.html

有个需求mybatis 插入的时候不知道有哪些字段,需要动态的传入值和字段

有个需求mybatis 插入的时候不知道有哪些字段&#xff0c;需要动态的传入值和字段&#xff0c; Java code? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Test public void testAddProductGuaranty() { //1 560 50000 2014/10/2 0:00:00 2014/11/1 0…

readonly的用法

转载于:https://www.cnblogs.com/w123w/p/10958567.html

mybatis insert 动态生成插入的列及插入的值

代码如下 &#xff1a; 1.mapper.xml 文件 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper name…

loj2245 [NOI2014]魔法森林 LCT

[NOI2014]魔法森林 链接 loj 思路 a排序&#xff0c;b做动态最小生成树。 把边拆成点就可以了。 uoj98.也许lct复杂度写假了、、越卡常&#xff0c;越慢 代码 #include <bits/stdc.h> #define ls c[x][0] #define rs c[x][1] using namespace std; const int N 2e5 7; …

Jenkins发布spring boot到hub.Docker 方法

在生成的目录下&#xff0c;建立个文件&#xff0c;文件名称为&#xff1a;Dockerfile FROM java:8 VOLUME /tmp ADD target/assignment-0.0.1-SNAPSHOT.jar /dalaoyang.jar ENTRYPOINT ["java","-Djava.security.egdfile:/dev/./urandom","-jar&q…

网页视频直播、微信视频直播技术解决方案:EasyNVR与EasyDSS流媒体服务器组合之区分不同场景下的直播接入需求...

背景分析 熟悉EasyNVR产品的朋友们都知道&#xff0c;EasyNVR不仅可以独成体系&#xff0c;而且还可以跟其他系列产品相配合&#xff0c;形成各种不同类型的解决方案&#xff0c;满足各种不同应用场景的实际需求。针对很多设备现场没有固定公网IP&#xff0c;但是又想实现公网、…

如何解决VMware Workstation 10.0.0 build-1295980马赛克现象

VMware Workstation 10.0.0 build-1295980偶尔出现客户机马赛克现象&#xff0c;可切换至其它选项卡&#xff0c;再切换回去即可。 还有一种方式是关闭加速3D图形。 转载于:https://www.cnblogs.com/rms365/p/10961499.html

不同账号间的云资源授权方法

阿里云的访问控制RAM产品可以实现资源的分配和授权,在一个特殊的业务背景下,资源也可以实现跨账号的授权使用. 背景: 1.A公司,作为甲方Party A,出资购买云资源,对云资源具有所有权,但不实际管理,需要乙方配合. 2.B公司,作为乙方Party B,要管理A公司的云资源,需要A公司授权云资…

知乎上已获千赞,全网独家首发!

前言 选了开发这一行&#xff0c;就意味着想混得好就要持续学习&#xff0c;你的技术和薪资、位置直接挂钩&#xff0c;进步对于程序员的重要性就不赘述了&#xff0c;接下来作为过来人&#xff0c;为广大同行分享一些学习干货&#xff0c;希望可以帮到大家 1、网络 网络协议…

知乎上已获千赞,持续更新中

前言 不知不觉自己已经做了几年开发了&#xff0c;由记得刚出来工作的时候感觉自己能牛逼&#xff0c;现在回想起来感觉好无知。懂的越多的时候你才会发现懂的越少。 如果你的知识是一个圆&#xff0c;当你的圆越大时&#xff0c;圆外面的世界也就越大。 最近看到很多Androi…

centos下搭建Jenkins持续集成环境(安装jenkins)

centos下搭建Jenkins持续集成环境(安装jenkins) 1、安装JDK yum install -y java 2、安装jenkins 添加Jenkins库到yum库&#xff0c;Jenkins将从这里下载安装。 1 wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo 2 rpm --import h…

elementUi Dialog 对话框使用中数据获取问题

Dialog 对话框&#xff1a;使用中数据获取问题演示代码&#xff1a; <div class"centerContent"><ul><li class"contentBox" v-for"(notice,index) in systemNotices" :key"index"> //循环取值<div class&quo…

全志_功能引脚配置_sys_config.fex

\lichee\tools\pack\chips\sun8iw5p1\configs\vstar\sys_config.fex;---------------------------------------------------------------------------------------------------------————————; port configuration:; port_name port:GPIO<mux><pull up/down&…

离开小厂进大厂的第一周,BTAJ大厂最新面试题汇集,面试总结

大佬带你走进Android开发的世界&#xff0c;掌握了这些知识点&#xff0c;学习Android也可以很轻松。 核心分析内容 对于怎么学习Android&#xff0c;主要解决的是3个问题&#xff1a;学什么、怎么学 & 怎么用。 具体如下&#xff1a; 下面&#xff0c;我将带着上述几个问…

POI增加 数据验证 下拉

POI增加验证列 List<String> nationality new ArrayList<String>();List<String> last_education new ArrayList<String>();List<String> graduated_yotei new ArrayList<String>();List<String> entrance_period new ArrayLis…

同源策略和跨域

同源策略是浏览器的一个安全功能&#xff0c;不同源的客户端脚本在没有明确授权的情况下&#xff0c;不能读写对方资源。所以a.com下的js脚本采用ajax读取b.com里面的文件数据是会报错的。 两个页面&#xff0c;域名 协议 端口都相同。表示同源 受前面所讲的浏览器同源策略的影…

程序员35岁真的是分水岭吗?小白也能看明白

前言 今天我给大家再次分享一下&#xff0c;我最近的一些读书的感想&#xff0c;思考起来&#xff0c;确实能够给自己带来一些真实的帮助和启发&#xff0c;希望大家在平时的工作学习中&#xff0c;也能够认清楚学习的一些本质。 如果我们的学习是在不断掌握应对具体工作场景…

远程桌面最新漏洞CVE-2019-0708 POC利用复现

POC有点鸡肋&#xff0c;并没有蓝屏&#xff01;&#xff01;&#xff01; POC运行环境&#xff1a; Python 3.5.6 |Anaconda 4.2.0 (64-bit)| (default, Aug 26 2018, 16:05:27) [MSC v.1 900 64 bit (AMD64)] on win32 依赖包及POC下载地址&#xff1a; 链接&#xff1a;http…