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的一种语法应用,利用闭包的原理去更改一个函数的功能,即让一个函数执行之前先到另外一个函数中执行其他需求语句,在执行该 ...
随机推荐
- Theano2.1.17-基础知识之剖析theano的函数
来自:http://deeplearning.net/software/theano/tutorial/profiling.html Profiling Theano function note:该方 ...
- 突破自我,开源NetWorkSocket通讯组件
前言 在<化茧成蝶,开源NetWorkSocket通讯组件>发表之后,收到大家很多个star,在此感谢!更可贵的是,一些网友提出了许多好建议,经过一些时间的思考,决定将NetworkSoc ...
- weinre 简记
在入职不久接触了移动端WEB开发,刚开始遇到的问题就是调试的问题.在PC端的时候,我常常纠结在IE与IE之间,主要的兼容问题还是IE一家子和他们的亲戚(啥多核浏览器,也是各种坑不断)之间.IE虽然问题 ...
- 新时代的coder如何成为专业程序员
在移动互联网"泛滥"的今天,越来越多非专业(这里的非专业指的是非计算机专业毕业的程序员)程序员加入到了IT行业中来了,可能是因为移动互联网的火爆导致程序员容易就业而且工资很高,可能 ...
- Hibernate之Annotation(注解的方式,非映射)
在hibernate 3.0之后,可以建立一个符合JPA标准的Annotation,以hibernate3.3.2GA为例 Annotation 以 hibernate Annotation 3.3. ...
- mysql安装方法
Window版本 1.下载 MySQL Community Server 5.7.16 http://dev.mysql.com/downloads/mysql/ 2.解压 如果想要让MySQL安装在 ...
- jQuery总结(2016-7-4)
1.事件对应有事件的方法, 如click事件, 有click()方法. 2.jQuery动画 3.AJAX是与服务器交换数据的技术! load()方法 get()方法 post()方法
- Retrofit 2.1 入门
Retrofit 2.1入门 , map); try { Response<String>body=call.execute(); System.out. ...
- bootstrap 2.3版与3.0版的使用区别
bootstrap 2.3版与3.0版的使用区别 bootstrap已经推出了3.0的新版,看起来2.3.x版本也不会再更新了.那么bootstrap 2.3版与3.0版的区别在哪里呢?下面我们就来介 ...
- C#把datetime类型的日期转化成年月日或其他格式方法总结
日期格式:yyyyMMdd HH:mm:ss(注意此字符串的字母大小写很严格) yyyy:代表年份MM: 代表月份dd: 代表天HH: 代表小时(24小时制)mm: 代表分钟ss: 代表秒D ...