21-跟我一起学.NetCore之MVC过滤器,这篇看完走路可以仰着头走
connygpt 2024-11-28 08:06 10 浏览
前言
MVC过滤器在之前http://Asp.Net的时候就已经广泛使用啦,不管是面试还是工作,总有一个考点或是需求涉及到,可以毫不疑问的说,这个技术点是非常重要的; 在之前参与的面试中,得知很多小伙伴只知道有一两个过滤器,而对其执行顺序了解的还是很模糊,少部分小伙伴甚至还没有使用过。这里就详细来说说这块的内容。
正文
来,直接上菜,然后再慢慢品;在Asp.NetCore 中,MVC有以下五种过滤器,根据执行顺序的不同,用于不同场景:
上图中大概的流程如下:
- 用户发起一个请求;
- 请求经过Asp.NetCore应用程序的中间件管道;
- 管道走完之后进入MVC的第一个过滤器:授权过滤器;
- 授权通过之后进入资源过滤器的前置方法;
- 将异常过滤器加入使用,后续有异常可以进行捕获,之前如果发生异常不能捕获;
- 进行数据模型绑定,比如参数通过数据模型绑定传参;
- 进入Action过滤器前置方法;
- 执行Action方法具体逻辑;
- 进入Action过滤器后置方法;
- 进入Result过滤器前置方法;
- 渲染Result结果;
- 进入Result过滤器后置方法;
- 进入资源过滤器的后置方法;
- 进入中间件管道返回;
- 最后将响应结果展现给用户;
接下来就好好说说每种过滤器的使用,老规矩,还是WebApi项目↓↓↓
- 授权过滤器(Authorization Filter)
授权,用于验证请求是否有权限访问对应的Action,一般包含登录验证、菜单权限(即接口权限)验证等。授权过滤器只对请求进行验证,是单向的,响应返回时不走该过滤器;
代码撸起来:
这里先进行全局注册过滤器进行测试,即只要注册之后,所有请求都需要经过授权过滤器校验,后续单独说说注册方式范围:
在默认生成的接口中打印字符串,方便看执行结果:
运行看结果:
通过上图可以看到,已经进入授权过滤器中进行相关逻辑判断;如果将授权逻辑中的局部变量validate设置为true,运行结果如下:
看过上一篇(跟我一起学.NetCore之熟悉的接口权限验证不能少(Jwt))的小伙伴肯定有疑问:这和授权中间件中使用Authorize特性授权有什么区别?没看过的小伙伴也没关系,应该也会有同样的疑问;来,听我慢慢道来,老套路,扒扒授权中间件的代码,看看怎么回事?
先来看看Authorize特性里面都有什么,关键是实现了IAuthorizeData接口,如下图:
找到授权的入口点,即中间件注册授权那里着手,如下图:
从而找AuthorizationMiddleware的具体实现,关键代码如下图:
总的来说,使用授权中间的时,标注Authorize特性的Action,会通过默认的AuthorizeFilter进行验证处理,这就是为什么在上一节权限验证的时候我们没有单独编写授权过滤器,而是偏重于校验的逻辑,只关注验证的角色或策略;这里就不打算再看AuthorizeFilter的源码,有兴趣的小伙伴好好研究研究。
- 资源过滤器(Resource Filter)
资源过滤器分为前置方法和后置方法,一般都会在前置方法做相关处理,比如说需要改改模型绑定的逻辑,但更多常用的是用于数据缓存处理,因为是在授权过滤器之后的第一个,如果取得缓存数据,直接返回结果,就减少后面代码逻辑执行;后置方法在之后所有代码逻辑执行完成,返回时经过。
代码撸起来:
这里还是以全局的方式进行注册资源过滤器:
运行效果如下:
将授权过滤器中的validate改为false,这里模拟代表有权限继续执行:
- 异常过滤器(Exception Filter)
用于服务器向客户端写入响应内容之前进行系统异常捕获,一般用于业务场景统一异常的处理,如果没有特殊需求,不必每种业务都进行异常处理,通过异常过滤器统一捕获处理即可,记录相关日志,便于异常问题分析;
先模拟处理业务时,抛异常了,如下:
异常信息直接返回给用户,体验是相当不好的,所以一般会将异常进行捕获处理,由于异常信息容易让开发者进行问题排查,所以一般会将其以日志的形式记录;系统中肯定会考虑很多异常的地方,不可能处处都进行手动捕获一下再处理,显得代码臃肿的同时还不好维护,所以用异常过滤器统一进行捕获处理就显得很有必要了,当然,一些很关键的业务可以进行单独捕获处理;异常过滤使用如下:
将其全局注册,看运行效果:
小伙伴看到这,有没好奇为什么不在授权过滤器和资源过滤器中抛出异常测试,而是选择在Action方法中抛出异常,还记得第一张图过滤器顺序吗(小伙伴再去重温一下~),那是因为授权过滤器和资源过滤器那还没有异常过滤器,所以发生异常时捕获不到,这也是小伙伴要特别注意的,需要自己处理好异常;只要在异常过滤器之后请求处理的异常都能捕获到啦;
- Action过滤器(Action Filter)
Action过滤器有前置和后置两种方法,一般偏向于业务使用,比如在前置方法中进行验证模型绑定参数的合法性,也可以对参数进行加工等;后置方法可以对返回结果的处理;
平时用的比较多,如下:
全局注册,运行如下:
有没有想试一下,在Action过滤器方法中抛出异常时,看看异常过滤器能不能捕获到,答案肯定是:能,但在这不截图给小伙伴们看,小伙伴们动手试试嘛。
- 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综艺圈",跟我一起学~~~
相关推荐
- 3分钟让你的项目支持AI问答模块,完全开源!
-
hello,大家好,我是徐小夕。之前和大家分享了很多可视化,零代码和前端工程化的最佳实践,今天继续分享一下最近开源的Next-Admin的最新更新。最近对这个项目做了一些优化,并集成了大家比较关注...
- 干货|程序员的副业挂,12个平台分享
-
1、D2adminD2Admin是一个完全开源免费的企业中后台产品前端集成方案,使用最新的前端技术栈,小于60kb的本地首屏js加载,已经做好大部分项目前期准备工作,并且带有大量示例代码,助...
- Github标星超200K,这10个可视化面板你知道几个
-
在Github上有很多开源免费的后台控制面板可以选择,但是哪些才是最好、最受欢迎的可视化控制面板呢?今天就和大家推荐Github上10个好看又流行的可视化面板:1.AdminLTEAdminLTE是...
- 开箱即用的炫酷中后台前端开源框架第二篇
-
#头条创作挑战赛#1、SoybeanAdmin(1)介绍:SoybeanAdmin是一个基于Vue3、Vite3、TypeScript、NaiveUI、Pinia和UnoCSS的清新优...
- 搭建React+AntDeign的开发环境和框架
-
搭建React+AntDeign的开发环境和框架随着前端技术的不断发展,React和AntDesign已经成为越来越多Web应用程序的首选开发框架。React是一个用于构建用户界面的JavaScrip...
- 基于.NET 5实现的开源通用权限管理平台
-
??大家好,我是为广大程序员兄弟操碎了心的小编,每天推荐一个小工具/源码,装满你的收藏夹,每天分享一个小技巧,让你轻松节省开发效率,实现不加班不熬夜不掉头发,是我的目标!??今天小编推荐一款基于.NE...
- StreamPark - 大数据流计算引擎
-
使用Docker完成StreamPark的部署??1.基于h2和docker-compose进行StreamPark部署wgethttps://raw.githubusercontent.com/a...
- 教你使用UmiJS框架开发React
-
1、什么是Umi.js?umi,中文可发音为乌米,是一个可插拔的企业级react应用框架。你可以将它简单地理解为一个专注性能的类next.js前端框架,并通过约定、自动生成和解析代码等方式来辅助...
- 简单在线流程图工具在用例设计中的运用
-
敏捷模式下,测试团队的用例逐渐简化以适应快速的发版节奏,大家很早就开始运用思维导图工具比如xmind来编写测试方法、测试点。如今不少已经不少利用开源的思维导图组件(如百度脑图...)来构建测试测试...
- 【开源分享】神奇的大数据实时平台框架,让Flink&Spark开发更简单
-
这是一个神奇的框架,让Flink|Spark开发更简单,一站式大数据实时平台!他就是StreamX!什么是StreamX大数据技术如今发展的如火如荼,已经呈现百花齐放欣欣向荣的景象,实时处理流域...
- 聊聊规则引擎的调研及实现全过程
-
摘要本期主要以规则引擎业务实现为例,陈述在陌生业务前如何进行业务深入、调研、技术选型、设计及实现全过程分析,如果你对规则引擎不感冒、也可以从中了解一些抽象实现过程。诉求从硬件采集到的数据提供的形式多种...
- 【开源推荐】Diboot 2.0.5 发布,自动化开发助理
-
一、前言Diboot2.0.5版本已于近日发布,在此次发布中,我们新增了file-starter组件,完善了iam-starter组件,对core核心进行了相关优化,让devtools也支持对IAM...
- 微软推出Copilot Actions,使用人工智能自动执行重复性任务
-
IT之家11月19日消息,微软在今天举办的Ignite大会上宣布了一系列新功能,旨在进一步提升Microsoft365Copilot的智能化水平。其中最引人注目的是Copilot...
- Electron 使用Selenium和WebDriver
-
本节我们来学习如何在Electron下使用Selenium和WebDriver。SeleniumSelenium是ThoughtWorks提供的一个强大的基于浏览器的开源自动化测试工具...
- Quick 'n Easy Web Builder 11.1.0设计和构建功能齐全的网页的工具
-
一个实用而有效的应用程序,能够让您轻松构建、创建和设计个人的HTML网站。Quick'nEasyWebBuilder是一款全面且轻巧的软件,为用户提供了一种简单的方式来创建、编辑...
- 一周热门
- 最近发表
- 标签列表
-
- kubectlsetimage (56)
- mysqlinsertoverwrite (53)
- addcolumn (54)
- helmpackage (54)
- varchar最长多少 (61)
- 类型断言 (53)
- protoc安装 (56)
- jdk20安装教程 (60)
- rpm2cpio (52)
- 控制台打印 (63)
- 401unauthorized (51)
- vuexstore (68)
- druiddatasource (60)
- 企业微信开发文档 (51)
- rendertexture (51)
- speedphp (52)
- gitcommit-am (68)
- bashecho (64)
- str_to_date函数 (58)
- yum下载包及依赖到本地 (72)
- jstree中文api文档 (59)
- mvnw文件 (58)
- rancher安装 (63)
- nginx开机自启 (53)
- .netcore教程 (53)