在线 建站单页面网站带后台,wordpress更改字体,广西住建局和城乡建设局,wordpress是什么程序前言MVC过滤器在之前Asp.Net的时候就已经广泛使用啦#xff0c;不管是面试还是工作#xff0c;总有一个考点或是需求涉及到#xff0c;可以毫不疑问的说#xff0c;这个技术点是非常重要的#xff1b; 在之前参与的面试中#xff0c;得知很多小伙伴只知道有一两个过滤器不管是面试还是工作总有一个考点或是需求涉及到可以毫不疑问的说这个技术点是非常重要的 在之前参与的面试中得知很多小伙伴只知道有一两个过滤器而对其执行顺序了解的还是很模糊少部分小伙伴甚至还没有使用过。这里就详细来说说这块的内容。正文来直接上菜然后再慢慢品在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综艺圈识别关注跟我一起学~~~撸文不易莫要白瞟三连走起~~~~