MVC5-11 浅谈拦截器
Filter拦截器
Aop是MVC的主要设计方式之一,而微软也希望我们在使用MVC的时候更好的使用拦截器来进行切面编程。拦截器则是Mvc中的一大亮点与重点
AOP(面向切面)编程已经广泛应用在各个项目中,切面编程把我们的action切出了执行前与执行后或者是特定的需求比如异常发生时。让我们可以在切面中从容的完成记日志、检查权限等操作。在action中开发人员只需要关于核心业务。
可以看到Controller已经为我们集成了一些Filter接口

IActionFilter -- > Action执行前后
IAuthenticationFilter --> Action安全验证
IAuthorizationFilter --> Action身份验证
IExceptionFilter --> Action出现异常时
IResultFilter --> 结果返回前后
但是我们的Controller并没有去实现这些接口中的方法,而是留给了子类也就是xxxController我们的控制器去实现。我们可以去重写方法,但是这种方式只能在当前的控制器生效,并不能在其它的控制器中生效,这显然并不是我们想要的。

现在我需要在action执行前去验证一下参数的合法性并适用与所有的Controller,我们可以创建一个Attribute继承IActionFilter和Attribute,更简单的我们可以直接继承ActionFilterAttribute重写OnActionExecuting方法 (actionFilterAttribut继承了IActionFilter与IResultFilter)
下面进行了简单的一个判断,如果UserName为null或者不等于admin就跳转到Error页面

然后再加到action上就可以完成了,但是上面提到了,我们在所有的Controller中都要用到,难道里面每个action都要去加,这太麻烦。 我们可以加到Filter的集合中在Global中进行初化。


浅谈内部原理
这里不对所有的拦截器都演示一次,因为讲起来篇幅挺多的。大多在博客园都可以找到不错的文章。这里讲一下像ActionFilter背后是如何实现的,是如何在action前后进行拦截的

重点其实就在AsyncControllerActionInvoker类中的InvokeActionMethodFilterAsynchronouslyRecursive方法,在这里执行了filter的OnActionExceuting方法,然后判断Result是否为空,否的话就直接到OnActionExecuted不会走action了。 在try里可以看到方法是递归调用的,正常的话会去执行我们的action然后再回到这边调用OnActionExceuted


MVC5-11 浅谈拦截器的更多相关文章
- SpringBoot(11) SpringBoot自定义拦截器
自定义拦截器共两步:第一:注册.第二:定义拦截器. 一.注册 @Configuration 继承WebMvcConfigurationAdapter(SpringBoot2.X之前旧版本) 旧版本代码 ...
- 浅谈装饰器(Python)
先来了解函数和执行函数在python的区别 我再重新定义一个函数,在函数前面加上@set_func 执行结果如下: 函数前面没有加@set_fun 执行结果如下: 是不是可以不修改原来的函 ...
- python3.x 浅谈修饰器
#装饰器用法,好处#简化代码,避免重复性代码#打印日志 @log#检测性能 @performance#数据库事务 @transaction#URL路由 @post('/register') 简单例子: ...
- Python之浅谈装饰器
目录 闭包函数 装饰器 迭代器 闭包函数 就是将原先需要调用好几遍的函数和参数写入一个包内,下次调用时一起调用 def name(x): x=1 def age(): print(x) return ...
- Struts2拦截器介绍
一.拦截器简介 Struts拦截器和Action的关系如图: 为了在使用拦截器时制定参数值,应通过<interceptor-ref -/>元素添加<param -/>子元素来为 ...
- Spring MVC 拦截器 (十)
完整的项目案例: springmvc.zip 目录 实例 除了依赖spring-webmvc还需要依赖jackson-databind(用于转换json数据格式) <!--json-->& ...
- 浅谈Struts2拦截器的原理与实现
拦截器与过滤器 拦截器是对调用的Action起作用,它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了 ...
- 谈一谈struts2和springmvc的拦截器
最近涉及到了两个项目,都需要考虑全局的拦截器,其功能就是判断session的登陆状态,如果session信息完好,可以从中取得相应的信息,则放行,否则拦截,进入重定向的uri. 既然是全局的拦截器,其 ...
- 浅谈Django的中间件与Python的装饰器
浅谈Django的中间件 与Python的装饰器 一.原理 1.装饰器是Python的一种语法应用,利用闭包的原理去更改一个函数的功能,即让一个函数执行之前先到另外一个函数中执行其他需求语句,在执行该 ...
随机推荐
- Hibernate hbm2ddl.auto DDL语句 控制台输出的配置
在开发中我们需要知道hbm2ddl.auto生成的SQL语句,来判断代码的正确性,现在记录配置的过程. Hibernate的DDL语句在控制台的输出配置: 一.在lib中确保只有下面的三个相关包:1) ...
- 通过js动态生成页面表格
var redlineTemplateP = $(".redlineDataList"); for (var index in detailArraryLists.rows){ v ...
- SEO初级优化--HTML、CSS、JS
HTML: 1.标签的有开有合. 2.避免冗余代码,例如去除空格字符. 3.合理利用标签语义化. 4.合理的嵌套规则,避免行元素内嵌套块元素. 5.img标签内需要添加title属性和alt属性. 6 ...
- swift——uiwebview的使用
首先,创建一个label: agreeDeal = UILabel() let tap = UITapGestureRecognizer.init(target: self, action: #sel ...
- StackExchange.Redis--纯干货喂饱你
Redis和StackExchange.Redis redis有多个数据库1.redis 中的每一个数据库,都由一个 redisDb 的结构存储.其中,redisDb.id 存储着 redis 数据库 ...
- 大新闻!HoloLens即将入华商用
昨天微软搞了大新闻,Terry和Alexi到了深圳,在WinHEC大会上宣布了2017上半年HoloLens正式入华商用. 关于HoloLens的技术原理和细节官方文档和报道已经披露很多了,他是一款真 ...
- 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”
这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...
- Java程序-进程中的"进程"
进程 我们知道程序在磁盘上的时候是静态的,当他被加载到内存的时候,就变成了一个动态的,称为进程,如下图是程序被加载到内存后,在内存中的分布情况如下 此图来自http://blog.csdn. ...
- nios II--实验2——led硬件部分
Led 硬件开发 新建原理图 1.打开Quartus II 11.0,新建一个工程,File -> New Project Wizard…,忽略Introduction,之间单击 Next> ...
- 如何实现EndNote中的PDF批量导出
如果在EndNote数据库中已建立大量的参考文献,且每条文献都有PDF文件对应,怎样将需要的某十几条甚至几十条参考文献对应的PDF文件从数据库导出另存在新建的文件夹 1. 按住“Ctrl”键,逐条 ...