MVC过滤器详解 面向切面编程(AOP)
面向切面编程:Aspect Oriented Programming(AOP),面向切面编程,是一个比较热门的话题。AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。比如我们最常见的就是日志记录了
面向切面编程也就是使用过滤器,过滤器就是当出现某种情况,执行一段额外的代码,比如异常过滤器,代码中任何一个地方出现异常都会执行
过滤器 必须以Attribute结尾,想控制器一Controller结尾一个道理
自定义过滤器
若要自定义一个过滤器,则要继承ActionFilterAttribute类,这个类是一个抽象类,实现了IActionFilter和IResultFilter接口,主要通过重写四个虚方法来达到在行为方法执行和返回的前后注入逻辑
方法 |
参数 |
描述 |
OnActionExecuting |
ActionExecutingContext |
在行为方法执行前执行 |
OnActionExecuted |
ActionExecutedContext |
在行为方法执行后执行 |
OnResultExecuting |
ResultExecutingContext |
在行为方法返回前执行 |
OnResultExecuted |
ResultExecutedContext |
在行为方法返回后执行 |
四个方法执行顺序是OnActionExecuting——>OnActionExecuted——>OnResultExecuting——>OnResultExecuted。上面四个方法的参数都是继承基ContollorContext类。例如下面定义了一个自定义的过滤器
过滤器代码:
namespace MvcValidateDemo.Models {//AllowMultiple = true:允许多个标签同时都起作用//[AttributeUsage(AttributeTargets.All,AllowMultiple = true)]public class MyActionFilterAttribute : ActionFilterAttribute{public string Name { get; set; }//Action 执行之前先执行此方法public override void OnActionExecuting(ActionExecutingContext filterContext){base.OnActionExecuting(filterContext); HttpContext.Current.Response.Write("<br />OnActionExecuting :" + Name);}//Action执行之后public override void OnActionExecuted(ActionExecutedContext filterContext){base.OnActionExecuted(filterContext);HttpContext.Current.Response.Write("<br />OnActionExecuted :" + Name);}//ActionResult执行之前先执行此方法public override void OnResultExecuting(ResultExecutingContext filterContext){base.OnResultExecuting(filterContext);HttpContext.Current.Response.Write("<br />OnResultExecuting :" + Name);}public override void OnResultExecuted(ResultExecutedContext filterContext){base.OnResultExecuted(filterContext);HttpContext.Current.Response.Write("<br />OnResultExecuted :" + Name);}} }
使用该过滤器即在action/类上添加该类的标记:
namespace MvcValidateDemo.Controllers {[MyActionFilter(Name = "HomeController")]public class HomeController : Controller{//// GET: /Home/[MyActionFilter(Name = "Index Action")]public ActionResult Index(){Response.Write("<p>Action执行了</p>");return Content("<br />ok:视图被渲染<br />");}public ActionResult About(){return Content("<P>About 渲染</P>");}} }
如果想定义全局过滤器,比如登录验证,不通过的跳转的登陆页
App_Start文件夹内的FilterConfig.cs文件就是放所有的全局过滤器
namespace MvcValidateDemo {public class FilterConfig{public static void RegisterGlobalFilters(GlobalFilterCollection filters){filters.Add(new MyExceptionFilterAttribute());//全局过滤器,优先级最低,但是可以作用到所有的控制器和action//filters.Add(new MyActionFilterAttribute(){Name = "Gloable"}); }} }
如果想让 控制器、Action、全区过滤器上的过滤器全部起作用,在过滤器类上加上下面这句话
//AllowMultiple = true:允许多个标签同时都起作用[AttributeUsage(AttributeTargets.All,AllowMultiple = true)]public class MyActionFilterAttribute : ActionFilterAttribute{
//页面跳转到错误页面或者是首页HttpContext.Current.Response.Redirect("/Home/Index");
转载于:https://www.cnblogs.com/xiaoshi657/p/4637472.html
MVC过滤器详解 面向切面编程(AOP)相关推荐
- Spring之面向切面编程AOP(八)
介绍&步骤 视频教程: https://www.bilibili.com/video/BV1WZ4y1P7Bp?p=121 官方笔记链接:https://pan.baidu.com/s/1dn ...
- 九、面向切面编程AOP
本栏博客目录 一.Spring的IOC和DI 二.IoC和DI注解开发 三.SpringMVC入门 四.SpringMVC的请求和响应 五.JdbcTemplate 六.Spring练习 七.Spri ...
- Spring in Action 入门之面向切面编程AOP
注明:这篇文章一是当成学习笔记,二是给大家提供另一个快速理解学习Spring的参考.欢迎留言讨论,持续更新中~ (该部分是Spring的面向切面编程AOP) 第四章 通知Bean 在软件编程中,散布于 ...
- 服务端第三次课程:面向切面编程AOP
3:面向切面编程AOP 1:回顾 bean的组装方式 规划的装配 component autowired sacn是在configuration底下的 Java config 使用configurat ...
- Spring-学习笔记08【面向切面编程AOP】
Java后端 学习路线 笔记汇总表[黑马程序员] Spring-学习笔记01[Spring框架简介][day01] Spring-学习笔记02[程序间耦合] Spring-学习笔记03[Spring的 ...
- Spring→面向切面编程AOP、相关概念、通知Advice类型、配置切面切入点通知、AOP相关API、AOP代理类ProxyFactoryBean、AOP注解@AspectJ
面向切面编程AOP CGLib AOP相关概念 Advice类型 Spring实现AOP Spring配置切面aspect 配置切入点pointcut 配置通知advice 配置通知参数 调用新的父类 ...
- Spring(四):面向切面编程AOP
2019独角兽企业重金招聘Python工程师标准>>> 横切关注点:分布于应用中多处的功能 面向切面编程AOP:将横切关注点与业务逻辑相分离 在使用面向切面编程时,仍在一个地方定义通 ...
- java切面编程 切面概念,面向切面编程(AOP)初探
面向对象编程通过设计和语言本身提供的模块化.封装.继承.多态来实现软件复用.尽管OOP在建模以及实现复杂软件方面非常成功,它仍然有一些问题.面向切面编程(AOP)被认为是一项有前途的新技术,它通过对交 ...
- 【ABP杂烩】面向切面编程(AOP)知识总结
目录 1.存在问题 2.AOP的概念 3.AOP应用范围 3.AOP实现方式 4.应用举例 5.结束语 本文在学习[老张的哲学]系列文章AOP相关章节后,自己归纳总结的笔记. 1.存在问题 最近,其它 ...
最新文章
- '*','*args','**','**kwargs'
- iOS SDWebImage 缓存机制与缓存策略
- 使用nginx解决跨域问题
- bash 历史记录_这些提示使Bash历史记录更加有用
- 蓝桥杯 ALGO-93 算法训练 反置数
- RocketMQ之消息中间件需要解决的问题
- Go语言基础进阶—程序结构—命名
- ElasticSearch 2 (18) - 深入搜索系列之控制相关度
- Oracle创建表的语法
- Typora使用技巧之插入图片及图片上传
- Syzmlw 蜗居在线播放
- HSC-1th misc——DORAEMON
- php 代码加密运行,php加密后可以直接运行吗
- pd.DataFrame()函数
- 进阶篇:2.1)DFMA实施障碍和关键
- 机柜系统:数据和业务的幕后英雄
- 软件架构基本技法——打包
- dell服务器r730老自动重启_Re: DELL R730 服务器异常卡死导致iDRAC控制台无信号以及服务器远程连接失败重启后报内存错误(已插拔并已改变卡槽位置)...
- java实现打印机打印
- 《30天自制操作系统》-day3(MAC)
热门文章
- go 控制台程序 重复启动_WebAssembly 与 go
- jmeter性能测试_JMeter性能测试,接口测试,最全的JMeter资料,共计3.16G
- Qt5.x解决报错main.cpp:1:10: fatal error: QApplication: No such file or directory问题
- python vars()_Python vars()
- spring框架_Spring框架
- sql like不包括_SQL Like – SQL不喜欢
- Hibernate Session合并,更新,保存,saveOrUpdate,持久化示例
- Android ButterKnife示例
- Python求笛卡尔积
- 路由接口无法配时钟频率