跟我一起学.NetCore之MVC过滤器,这篇看完走路可以仰着头走

前言

MVC过滤器在之前Asp.Net的时候就已经广泛使用啦,不管是面试还是工作,总有一个考点或是需求涉及到,可以毫不疑问的说,这个技术点是非常重要的; 在之前参与的面试中,得知很多小伙伴只知道有一两个过滤器,而对其执行顺序了解的还是很模糊,少部分小伙伴甚至还没有使用过。这里就详细来说说这块的内容。

正文

来,直接上菜,然后再慢慢品;在Asp.NetCore 中,MVC有以下五种过滤器,根据执行顺序的不同,用于不同场景:

上图中大概的流程如下:

  1. 用户发起一个请求;

  2. 请求经过Asp.NetCore应用程序的中间件管道;

  3. 管道走完之后进入MVC的第一个过滤器:授权过滤器;

  4. 授权通过之后进入资源过滤器的前置方法;

  5. 将异常过滤器加入使用,后续有异常可以进行捕获,之前如果发生异常不能捕获;

  6. 进行数据模型绑定,比如参数通过数据模型绑定传参;

  7. 进入Action过滤器前置方法;

  8. 执行Action方法具体逻辑;

  9. 进入Action过滤器后置方法;

  10. 进入Result过滤器前置方法;

  11. 渲染Result结果;

  12. 进入Result过滤器后置方法;

  13. 进入资源过滤器的后置方法;

  14. 进入中间件管道返回;

  15. 最后将响应结果展现给用户;

接下来就好好说说每种过滤器的使用,老规矩,还是WebApi项目↓↓↓

  1. 授权过滤器(Authorization Filter)

    授权,用于验证请求是否有权限访问对应的Action,一般包含登录验证、菜单权限(即接口权限)验证等。授权过滤器只对请求进行验证,是单向的,响应返回时不走该过滤器;

    代码撸起来:

    这里先进行全局注册过滤器进行测试,即只要注册之后,所有请求都需要经过授权过滤器校验,后续单独说说注册方式范围:

    在默认生成的接口中打印字符串,方便看执行结果:

    运行看结果:

    通过上图可以看到,已经进入授权过滤器中进行相关逻辑判断;如果将授权逻辑中的局部变量validate设置为true,运行结果如下:

    看过上一篇(跟我一起学.NetCore之熟悉的接口权限验证不能少(Jwt))的小伙伴肯定有疑问:这和授权中间件中使用Authorize特性授权有什么区别?没看过的小伙伴也没关系,应该也会有同样的疑问;来,听我慢慢道来,老套路,扒扒授权中间件的代码,看看怎么回事?


    先来看看Authorize特性里面都有什么,关键是实现了IAuthorizeData接口,如下图:

    找到授权的入口点,即中间件注册授权那里着手,如下图:

    从而找AuthorizationMiddleware的具体实现,关键代码如下图:

    总的来说,使用授权中间的时,标注Authorize特性的Action,会通过默认的AuthorizeFilter进行验证处理,这就是为什么在上一节权限验证的时候我们没有单独编写授权过滤器,而是偏重于校验的逻辑,只关注验证的角色或策略;这里就不打算再看AuthorizeFilter的源码,有兴趣的小伙伴好好研究研究。

  2. 资源过滤器(Resource Filter)

    资源过滤器分为前置方法和后置方法,一般都会在前置方法做相关处理,比如说需要改改模型绑定的逻辑,但更多常用的是用于数据缓存处理,因为是在授权过滤器之后的第一个,如果取得缓存数据,直接返回结果,就减少后面代码逻辑执行;后置方法在之后所有代码逻辑执行完成,返回时经过。

    代码撸起来:

    这里还是以全局的方式进行注册资源过滤器:

    运行效果如下:

    将授权过滤器中的validate改为false,这里模拟代表有权限继续执行:

  3. 异常过滤器(Exception Filter)

    用于服务器向客户端写入响应内容之前进行系统异常捕获,一般用于业务场景统一异常的处理,如果没有特殊需求,不必每种业务都进行异常处理,通过异常过滤器统一捕获处理即可,记录相关日志,便于异常问题分析;

    先模拟处理业务时,抛异常了,如下:

    异常信息直接返回给用户,体验是相当不好的,所以一般会将异常进行捕获处理,由于异常信息容易让开发者进行问题排查,所以一般会将其以日志的形式记录;系统中肯定会考虑很多异常的地方,不可能处处都进行手动捕获一下再处理,显得代码臃肿的同时还不好维护,所以用异常过滤器统一进行捕获处理就显得很有必要了,当然,一些很关键的业务可以进行单独捕获处理;异常过滤使用如下:

    将其全局注册,看运行效果:

    小伙伴看到这,有没好奇为什么不在授权过滤器和资源过滤器中抛出异常测试,而是选择在Action方法中抛出异常,还记得第一张图过滤器顺序吗(小伙伴再去重温一下~),那是因为授权过滤器和资源过滤器那还没有异常过滤器,所以发生异常时捕获不到,这也是小伙伴要特别注意的,需要自己处理好异常;只要在异常过滤器之后请求处理的异常都能捕获到啦;


  4. Action过滤器(Action Filter)

    Action过滤器有前置和后置两种方法,一般偏向于业务使用,比如在前置方法中进行验证模型绑定参数的合法性,也可以对参数进行加工等;后置方法可以对返回结果的处理;

    平时用的比较多,如下:

    全局注册,运行如下:

    有没有想试一下,在Action过滤器方法中抛出异常时,看看异常过滤器能不能捕获到,答案肯定是:能,但在这不截图给小伙伴们看,小伙伴们动手试试嘛。

  5. Result过滤器(Result Filter)

    Result过滤器也有前置和后置两种方法,前置方法可以在结果没返回前,可以对Action返回的结果进行干预处理,后置方法一般是结果已经渲染之后执行;

    API项目用的不多,在MVC Web项目比较适用,使用方式如下:

    将其进行全局注册,运行如下:

    同样在此过滤器中抛出异常,异常过滤器捕获不到啦。

    意不意外,惊不惊喜,其实只要开始进行响应结果处理时,异常过滤器就不捕获对应异常,需要自己单独处理;

过滤器的注册范围

除了上面的全局注册,过滤器还可以以特性的方式标注在控制器或对应Action方法上:

全局注册:针对系统中所有过滤器都有效;

标注在控制器上(Controller):对标注控制器中所有Action方法都有效;

标注在Action上:只针对对应的Action有效;

思路:如果有极个别Action不想使用统一的过滤器,可以通过标注特性的方式在对应过滤器逻辑中将其进行过滤掉。

过滤器注册方式

  • 全局方式注册

    在Startup中ConfigureServices注册服务时全局注册过滤器,如下图:

  • 特性方式标注

    A、继承Attribute类时,可以直接标注在控制器(Controller)和Action上,如下图:

    B、没有继承Attribute类的情况,借用TypeFilter、ServiceFilter或自定义IFilterFactory进行特性标注。

    TypeFilter的方式,如下图:

    ServiceFilter的方式需要单独注册一下过滤器服务,控制生命周期,如果没有注册过滤器服务会报异常,如下图:

    注册过滤器服务就正常了,如下图:

    自定义IFilterFactory,先实现一个特性类,如下:

    使用如下:

同种过滤器的执行顺序

对于不同类型过滤器的执行顺序,开篇的图就说明了,接下来说多个同种过滤器的执行顺序;

  • 不同范围的同种过滤器顺序

    上面说到过滤的注册范围,有全局注册、控制器标注、Action标注,同种过滤器在不同范围注册是什么个顺序?这里以常用的Action过滤器为例,其他过滤器的练习就交给小伙伴了,这里复制出MyActionFilter两份,分别改名为MyActionFilter1和MyActionFilter2,其中MyActionFilter用于全局注册,MyActionFilter1用于控制器特性标注,MyActionFilter2用于Action方法标注,运行结果如下:

    结论:全局注册->控制器->Action。

  • 相同范围的同种过滤器顺序

    将MyActionFilter、MyActionFilter1和MyActionFilter2三个过滤器都标注在Action上,全局和控制器上都注释掉,看效果:

    结论:默认情况注册或特性标注顺序与执行顺序一致。

到这可能小伙伴会想:终于结束啦!!!,哈哈哈,nonono,对于过滤器的执行顺序,除了以上默认顺序之外,是可以任意调整的,通过实现IOrderedFilter接口,设置对应过滤器的顺序属性即可改变对应的顺序,Order值越小,优先级就越高,如下使用:

没有效果图,差评? 别别别,这里是督促小伙伴自己试一把,不然小伙伴看一下就完事了(不自己操作一把,过两天就会忘),有没有用心良苦~

重点:Order排序优先于范围排序,即先会以Order进行排序,如果一致,再以注册的范围排序。

总结

好啦,完啦!主要分享了MVC各种过滤器的使用,大概的应用场景,执行顺序,注册范围及注册方式。有没有感觉脖子有点小酸,来,起来走走,仰着头的那种,标题是不是没骗小伙伴,绝对真实。 下一篇说说MediatR组件和中介者设计模式。

整理了一些面试资料,关注公众号“Code综艺圈”,发送"面试"获取下载地址,至于教程,手里的也有一些Web前端、.Net后端、Java的教程,但现在网上资源比较多,大部分小伙伴喜欢在线看;如果有需要,小伙伴可以私聊我,目前先把面试相关的资料放上去,收集内容会持续更新,包含一些大厂面试题,助力小伙伴找到心仪的工作:

教程截取部分图如下,有需要私聊我:

一个被程序搞丑的帅小伙,关注"Code综艺圈",识别关注跟我一起学~~~

撸文不易,莫要白瞟,三连走起~~~~

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

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

相关文章

彭博社:中企游说政府否决英伟达收购Arm

9月14日,英伟达与软银宣布达成最终协议,英伟达将以400亿美元的价格从软银收购ARM。在台积电明确于9月15日后不再向HW的ARM提供代工服务之后,一家美国公司又将ARM收入囊中,这使国产ARM CPU在设计和制造环节都存在巨大风险&#xff…

Explain各个字段的含义

文章目录[TOC]1:expanin的结果示例2:各个字段的含义(1):id(2):select_type(3):table(4):type(重要 我们利用索引查找出来的记录显示)(5): possible_keys(6):key(7):key_len(8):ref(8):rows(重要)(9):extra1:expanin的结果示例 mysql> explain select…

asp.net core监控—引入Prometheus(三)

上一篇博文中说到Prometheus有四种指标类型:Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)、Summary(摘要),并且我们做了一个Counter的Demo&#xff0c…

秋招日常(一天三封感谢信)

就离谱 上午收到两封 搞得复习贼没心态 下午打完球回来一看手机又收到一封 这个有点伤 自己测评完 笔试 笔试完 约面 技术面过了 hr又面 面完说等消息 我寻思hr面能有啥可挂的 就离谱 一想到自己经过那么多轮 还是挂了 就难受 什么鬼 求求了 给个offer吧 要不我快成了天天向下的…

asp.net core监控—引入Prometheus(一)

Prometheus是CNCF毕业的第二个项目,算是明星产品(可自行了解Prometheus的功能),asp.net core当然不能错过与之配套使用。在.net中是通过prometheus.net【https://github.com/prometheus-net/prometheus-net】引入的。上图是用Prom…

1024福利 | .NET社区联合清华大学出版社送好书来啦!

话不多说,直入主题。.NET社区各大公众号联合清华大学出版社为粉丝送上1024的福利,还请诸位笑纳!!!有哪些书呢?.NET并发编程实战 作者:[美] 里卡尔多特雷尔(Riccardo Terrell&#xf…

asp.net core监控—引入Prometheus(二)

上一篇博文中,说明了怎么引进Prometheus到asp.net core项目中,因为是Demo,所以Prometheus和Grafana都是windows版本,本地执行的,生产环境上这些服务可以根据的公司的架构,放到适合的环境内,现在…

ASP.NET Core Blazor Webassembly 之 渐进式应用(PWA)

Blazor支持渐进式应用开发也就是PWA。使用PWA模式可以使得web应用有原生应用般的体验。什么是PWAPWA应用是指那些使用指定技术和标准模式来开发的web应用,这将同时赋予它们web应用和原生应用的特性。例如,web应用更加易于发现——相比于安装应用&#xf…

TCP三次握手(详解)

一:引出 客户端与服务器之间数据的发送和返回的过程当中需要创建一个叫TCP connection的东西;由于TCP不存在连接的概念,只存在请求和响应,请求和响应都是数据包,它们之间都是经过由TCP创建的一个从客户端发起&#xf…

进击吧! Blazor !第五期 安全

Blazor 是一个 Web UI 框架,可通过 WebAssembly 在任意浏览器中运行 .Net 。Blazor 旨在简化快速的单页面 .Net 浏览器应用的构建过程,它虽然使用了诸如 CSS 和 HTML 之类的 Web 技术,但它使用 C#语言和 Razor 语法代替 JavaScrip…

有一种无耻叫 “我是为你着想”

这是头哥侃码的第221篇原创十一之后,我的状态一直不好,总感觉胸口有东西堵着,时不时还会觉得呼吸困难。上周末,我咨询了几位有医学背景的朋友,有说是因为季节转换而造成的身体不适,不用在意,但也…

asp.net core监控—引入Prometheus(四)

上一篇博文中说到Prometheus有四种指标类型:Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)、Summary(摘要),并且我们做了一个Counter的Demo&#xff0c…

[开源] .Net ORM FreeSql 1.10.0 稳步向前

写在开头FreeSql 是 .NET 开源生态下的 ORM 轮子,转眼快两年了,说真的开源不容易(只有经历过才明白)。今天带点干货和湿货给大家,先说下湿货。认识我的人,知道 CSRedisCore 是我写的另外一个开源组件&#…

CAP-微服务间通信实践

微服务间通信常见的两种方式由于微服务架构慢慢被更多人使用后,迎面而来的问题是如何做好微服务间通信的方案。我们先分析下目前最常用的两种服务间通信方案。gRPC(rpc远程调用)gRPC-微服务间通信实践场景:A服务主动发起请求到B服…

软件构造学习笔记-第二周

本周课程把第六章测试的内容提前讲了一部分,主要为实验1服务,讲了有关测试的概念、作用和基本方法。“测试优先”的思想是非常重要的,根据spec写出简单而全面的测试,在方法/类完成后第一时间对其进行测试,保证每个方法…

T-SQL | 你需要了解的执行计划

【T-SQL】| 作者 / Edison Zhou这是EdisonTalk的第297篇学习分享T-SQL是ANSI和ISO SQL标准的MS SQL扩展,其正式名称为Transact-SQL,但一般程序员都称其为T-SQL。本文是我学习《T-SQL查询》一书的读书笔记,为你讲解执行计划是个什么鬼。1关于执…

软件构造学习笔记-实验1

记录一下做实验1时遇到的问题。 准备工作 1.GitHub的注册和配置 由于之前没有接触过GitHub,所以碰到了一些问题。GitHub是什么?怎么建立GitHub远程仓库与本地仓库的连接?怎么在GitHub上传和下载文件? 实验完成后我可以简单回答上…

好的自我介绍,面试成功一大半

大家好,我是Z哥。关于面试时的自我介绍,我想大家遇到的情况都差不多,大部分面试的第一个环节基本都是这个。每个人也都知道留下好的第一印象很重要,但我估计很多人对这件事的解决方式,也就在网上找个自我介绍的模版就完…

软件构造学习笔记-第三周

本周介绍了软件开发的几种模型,并重点介绍了Git。Git是分布式版本控制系统,可以通过SSH key建立远程与本地的连接,通过Git Bash中的命令进行文件的上传和下载。对于这门课程,Git的主要作用就是向TA提交实验代码。 软件开发生命周…